Part A Convolution Neural Networks¶

Name Admin No. Class
Ernest Ng Sheng Kang P2222668 DAAA/FT/2B/06

Background Infomation¶

Convolutional Neural Networks (CNNs) are specialized artificial neural networks designed for processing structured grid data, particularly images. They have become widely popular in computer vision tasks due to their capacity to automatically learn hierarchical features from input data.

Initializing Libaries¶

In [ ]:
import tensorflow as tf
import os
import json
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import seaborn as sns
from sklearn.metrics import classification_report
from keras.utils import to_categorical
import keras_tuner as kt
import visualkeras
from keras.regularizers import l1, l2
from keras.layers import AveragePooling2D, ZeroPadding2D, BatchNormalization, Activation, MaxPool2D, Add
from keras.models import Sequential
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Normalization, Dense, Conv2D, Dropout, BatchNormalization, ReLU
from keras.models import Sequential
from keras.models import Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras import Input
from keras.optimizers import *
from keras.callbacks import EarlyStopping
Using TensorFlow backend

Checking GPU¶

In [ ]:
tf.config.list_physical_devices('GPU')
Out[ ]:
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

Fixing random seed¶

Setting the seed for reproducibilty

In [ ]:
seed = 69
np.random.seed(seed)
tf.random.set_seed(seed)

Problem statement¶

Our problem for this assignment is to create a deep learning model to predict vegatables using the dataset on vegatables.

We need to create 2 seperate final models to predict images on 2 different input sizes:

  • 31 x 31
  • 128 x128

Goals of this project¶

Generalise to data well¶

To make sure our model is able to generalise to data well, we need to minimize the difference between our training accuracy and test accuracy.

Accuracy¶

In order to minimize avoidable bias, it is important for the model to achieve a training set accuracy of at least 85% or higher, which signifies a reasonable level of accuracy.

Importing Datasets¶

In [ ]:
directory_train = './datasets/Dataset for CA1 part A/train'
directory_test = './datasets/Dataset for CA1 part A/test'
directory_validation = './datasets/Dataset for CA1 part A/validation'

def dataset(directory,image_size,seed=seed,batch_size=64,shuffle=True):
    dataset = tf.keras.preprocessing.image_dataset_from_directory(
        directory,
        labels='inferred',
        label_mode='categorical',
        color_mode='grayscale',
        image_size=image_size,
        shuffle=shuffle,
        seed=seed,
        batch_size=batch_size
    )
    return dataset
In [ ]:
dataset_train_31 = dataset(directory_train,(31,31))
dataset_test_31 = dataset(directory_test,(31,31))
dataset_validation_31 = dataset(directory_validation,(31,31))

dataset_train_128 = dataset(directory_train,(128,128))
dataset_test_128 = dataset(directory_test,(128,128))
dataset_validation_128 = dataset(directory_validation,(128,128))
Found 9028 files belonging to 15 classes.
Found 3000 files belonging to 15 classes.
Found 3000 files belonging to 15 classes.
Found 9028 files belonging to 15 classes.
Found 3000 files belonging to 15 classes.
Found 3000 files belonging to 15 classes.

EDA¶

What can we get from our EDA?

  • How does the average image look like for each class?
  • How is the class distribution?
  • How does a sample image look like for each class?
In [ ]:
class_labels = [
    "Bean",
    "Bitter Gourd",
    "Bottle Gourd",
    "Brinjal",
    "Broccoli",
    "Cabbage",
    "Capsicum",
    "Carrot",
    "Cauliflower",
    "Cucumber",
    "Papaya",
    "Potato",
    "Pumpkin",
    "Radish",
    "Tomato",
]
In [ ]:
for images, labels in dataset_train_31.take(1):
    print("31x31 Batch Shape:", images.shape)
for images, labels in dataset_train_128.take(1):
    print("128x128 Batch Shape:", images.shape)
31x31 Batch Shape: (64, 31, 31, 1)
128x128 Batch Shape: (64, 128, 128, 1)

Our image shapes are 31x31 and 128x128, with a single colour channel.

We have a default batch size of 64, since tf.keras.preprocessing.image_dataset_from_directory requires a default batch size or else the model wont fit properly. Fortunatly we can set our batch size again when we fit our models.

Visualizing our datasets¶

In [ ]:
def plot_unique_images(dataset, title, class_labels):
    plt.figure(figsize=(12, 6))
    plt.suptitle(title, fontsize=20)
    unique_images = []  
    unique_labels = []  

    #get unique images
    for images, labels in dataset:
        for i, label in enumerate(labels):
            label_idx = tf.argmax(label).numpy()
            if label_idx not in unique_labels:
                unique_images.append(images[i].numpy().astype("uint8"))
                unique_labels.append(label_idx)

            if len(unique_images) == len(class_labels):
                break 
        if len(unique_images) == len(class_labels):
            break  

    num_images = len(unique_images)
    row = int(np.sqrt(num_images))
    col = int(np.ceil(num_images / row))

    for i in range(num_images):
        ax = plt.subplot(row, col, i + 1)
        plt.imshow(unique_images[i], cmap='gray')
        plt.title(class_labels[unique_labels[i]])
        plt.axis("off")

    plt.tight_layout()
    plt.show()

plot_unique_images(dataset_train_128, '128x128 Images for Each Class', class_labels)
No description has been provided for this image
In [ ]:
plot_unique_images(dataset_train_31, '31x31 Images for Each Class', class_labels)
No description has been provided for this image

Observations:

  • We can hardly differentiate some images between classes for images of size 31x31(brocoli,bitter_gourd), hopefully our model can better differeniate these images better than humans!

Now lets get a wider sample range of pictures of every class, to see how diverse the classes are.

In [ ]:
def plot_dataset_huge(amtOfImages, dataset,title,class_labels):
    plt.figure(figsize=(12, 10))
    plt.suptitle(title, fontsize=20)
    for images, labels in dataset.take(1):
        num_images = len(images)  

        row = int(np.sqrt(amtOfImages))
        col = int(np.ceil(amtOfImages / row))
            
        for i in range(min(amtOfImages, num_images)):
            ax = plt.subplot(row, col, i + 1)
            plt.imshow(images[i].numpy().astype("uint8"), cmap='gray')
            plt.title(class_labels[np.argmax(labels[i])])
            plt.axis("off")

    plt.subplots_adjust(wspace=0.1, hspace=0.01)
    plt.tight_layout()
    plt.show()

plot_dataset_huge(48,dataset_train_128,'128 x 128 images',class_labels)
No description has been provided for this image
In [ ]:
plot_dataset_huge(48,dataset_train_31,'31 x 31 images',class_labels)
No description has been provided for this image

Observations:

  • Cauliflowers and Potatos are easily differentiable, with potatos usually having a white background and cauliflowers having

Class Distribution¶

In [ ]:
class_counts_df = pd.DataFrame(columns=class_labels)

def count_classes(dataset, class_labels):
    class_count = {label: 0 for label in class_labels}
    for _, labels in dataset:
        for label in labels:
            class_name = class_labels[tf.argmax(label)]
            class_count[class_name] += 1
    return class_count

class_counts_df.loc['Validation'] = count_classes(dataset_validation_128, class_labels)
class_counts_df.loc['Training'] = count_classes(dataset_train_128, class_labels)
class_counts_df.loc['Test'] = count_classes(dataset_test_128, class_labels)
class_counts_df.loc['Total Classes'] = class_counts_df.sum()
class_counts_df['Total Datasets'] = class_counts_df.sum(axis=1)

class_counts_df
Out[ ]:
Bean Bitter Gourd Bottle Gourd Brinjal Broccoli Cabbage Capsicum Carrot Cauliflower Cucumber Papaya Potato Pumpkin Radish Tomato Total Datasets
Validation 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 3000
Training 780 720 441 868 750 503 351 256 587 812 566 377 814 248 955 9028
Test 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 3000
Total Classes 1180 1120 841 1268 1150 903 751 656 987 1212 966 777 1214 648 1355 15028
In [ ]:
class_counts_df_plot = class_counts_df.drop(['Total Datasets'], axis=1)
class_counts_df_plot = class_counts_df_plot.T
class_counts_df_plot

# Plot the bar graph
class_counts_df_plot['Total Classes'].plot(kind='bar', figsize=(17, 6))
plt.xlabel('Classes')
plt.ylabel('Total Images')
plt.title('Class Distribution')
plt.xticks(rotation=45)  # Rotate x-axis labels for better readability
plt.show()
No description has been provided for this image

We can see that we have an class imbalance for our train dataset. Oh No!! What should we do?

  • There are quite alot of solutions for this problem, here are 3 main solutions:
    1. We can augment our data on the minority classes(Bottle_gourd, carrots and radish). However we want to also augment our other images classes to prevent overfitting so this is not a good option.
    2. We can oversample or undersample our minority or majority classes.However oversampling can lead to overfitting without any data augmentation.
    3. We can modify the loss function to assign different weights to each class, such as increasing the loss weigh for our minority class.

Why will we be using differing class weights?¶

We will be assigning different weights for each class for a few reasons:

  • It helps preserve our existing data, as in our case we have classes that have a much smaller number of samples (Carrots and Radishs) compared to others.We effectively tell the model to pay more attention to the minority classes.
  • Prevents overfitting. As our model is encouraged to strike a balance between minimizing the loss and ensuring that all our classes are predicted accurately.
  • Simpler than Image oversampling. Using differing class weights can be more advantagous than image oversampling due to its increased computational costs and potential for overfitting without image augmentation.
In [ ]:
class_counts_df_plot['Training'].values
Out[ ]:
array([780, 720, 441, 868, 750, 503, 351, 256, 587, 812, 566, 377, 814,
       248, 955], dtype=int64)

We will be calculating the class weights using only the train data, as it is the only dataset with imbalanced classes.

In [ ]:
class_weights = tf.math.reciprocal(tf.constant(
(class_counts_df_plot['Training'].values).astype(np.float32)))

# Normalize the class weights
class_weights = class_weights / tf.reduce_sum(class_weights)
class_weights_dict = {i: weight for i, weight in enumerate(class_weights.numpy())}

print("Class Weights:", class_weights_dict)
Class Weights: {0: 0.042979263, 1: 0.046560865, 2: 0.07601774, 3: 0.038621914, 4: 0.04469843, 5: 0.06664775, 6: 0.09550946, 7: 0.13095243, 8: 0.05711043, 9: 0.041285496, 10: 0.05922937, 11: 0.088922605, 12: 0.041184057, 13: 0.1351767, 14: 0.03510348}

Another important question to ask is.¶

  • What are our pixel distributions for our datasets? and what is the std and mean of them?
In [ ]:
def compute_statistics(dataset,title):
    pixel_min = float('inf') 
    pixel_max = float('-inf')
    pixel_sum = 0
    pixel_sum_square = 0
    num_pixels = 0

    for images, _ in dataset:
        for image in images:
            # Calculate min and max pixel values
            pixel_min = min(pixel_min, np.min(image))
            pixel_max = max(pixel_max, np.max(image))

            # Update sum and sum of squares for mean and std calculation
            pixel_sum += np.sum(image)
            pixel_sum_square += np.sum(image ** 2)
            num_pixels += np.prod(image.shape)

    # Calculate mean and std
    pixel_mean = pixel_sum / num_pixels
    pixel_std = np.sqrt((pixel_sum_square / num_pixels) - (pixel_mean ** 2))

    print(title)
    print("Min Pixel Value:", pixel_min)
    print("Max Pixel Value:", pixel_max)
    print("Mean Pixel Value:", pixel_mean)
    print("Standard Deviation:", pixel_std)

    return

compute_statistics(dataset_train_31,'Training Images')
compute_statistics(dataset_test_31,'Test Images')
compute_statistics(dataset_validation_31,'Validation Images')
Training Images
Min Pixel Value: 0.0
Max Pixel Value: 255.0
Mean Pixel Value: 114.34127948859215
Standard Deviation: 55.387912533676406
Test Images
Min Pixel Value: 0.0
Max Pixel Value: 255.0
Mean Pixel Value: 114.66371605098855
Standard Deviation: 55.07995207606749
Validation Images
Min Pixel Value: 0.0
Max Pixel Value: 255.0
Mean Pixel Value: 113.78344607803287
Standard Deviation: 55.49623592897191
  • Our pixel values range from 0 to 255, which is expected as grayscale images typically have pixel values ranging from 0 (black) to 255 (white).
  • Our average pixel is around 114, which means that our images are not heavily skewed toward either very dark or very bright values.

Image Averaging¶

We will be using only the test and validation datasets for averaging as the train set has class imbalance and may result in inaccurate results.

In [ ]:
def calculate_mean_image(datasets, image_size, title):
    pixel_sum = np.zeros((image_size[0], image_size[1]), dtype=np.float64)
    num_images = 0
    mean_images = np.zeros((image_size[0], image_size[1]), dtype=np.float64)

    for dataset in datasets:
        for images, _ in dataset:
            for image in images:
                pixel_sum += np.squeeze(image, axis=-1)
                num_images += 1

    # Calculate the mean image
    mean_image = pixel_sum / num_images
    mean_images = mean_images + mean_image
    
    mean_images = mean_images / len(datasets)

    return mean_images
In [ ]:
image_size_31 = (31, 31)
image_size_128 = (128, 128)

mean_image_31 = calculate_mean_image([dataset_test_31, dataset_validation_31], image_size_31, 'Average Mean Image (31x31)')
mean_image_128 = calculate_mean_image([dataset_test_128, dataset_validation_128], image_size_128, 'Average Mean Image (128x128)')

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(mean_image_31, cmap='gray')
plt.title('31x31 Mean Image')
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(mean_image_128, cmap='gray')
plt.title('128x128 Mean Image')
plt.axis("off")
plt.tight_layout()
plt.show()
No description has been provided for this image

The mean image for all the images combined looks like a fog, and we cant really determine any of or classes from this average image.

In [ ]:
def calculate_class_mean_images(dataset, class_labels, image_size, title,amtOfImages=15):
    class_mean_images = {}  # To store the mean images for each class

    # Initialize mean images for each class
    for class_label in class_labels:
        class_mean_images[class_label] = np.zeros((image_size[0], image_size[1]), dtype=np.float64)

    num_images = 0

    for images, labels in dataset:
        for i, label in enumerate(labels):
            class_label = class_labels[np.argmax(label)]
            class_mean_images[class_label] += np.squeeze(images[i], axis=-1)
            num_images += 1

    num_images = amtOfImages
    row = int(np.sqrt(num_images))
    col = int(np.ceil(num_images / row))

    # Calculate and display the mean image for each class
    plt.figure(figsize=(10, 6))
    plt.suptitle(title, fontsize=20)

    for i, class_label in enumerate(class_labels):
        mean_image = class_mean_images[class_label] / (class_mean_images[class_label].max() + 1e-8)
        plt.subplot(row,col, i + 1)
        plt.imshow(mean_image, cmap='gray')
        plt.title(class_label)
        plt.axis("off")

    plt.tight_layout()
    plt.show()

calculate_class_mean_images(dataset_test_128, class_labels, image_size_128, 'Average Mean Images (128x128)')
calculate_class_mean_images(dataset_test_31, class_labels, image_size_31, 'Average Mean Images (31x31)')
No description has been provided for this image
No description has been provided for this image

Observations:

  • We can see that the pixels for different classes kind of group together to show where the vegetable is. For example, the average image for potato has a cluster of black pixels in the center, roughly outlining a potato.
  • However as the images in the dataset are quite complicated, it is quite hard to differentiate out individual classes without labels.

Data Preprocessing¶

We need to preprocess our data to help our models to converge faster ,ie lesser time to train. And helps the model to generalise better and prevent it from overfitting.

Normalizing our images¶

Why do we need to normalize our images?

As normalizing involves scalling the pixel values of our images between 0 and 1 , this results in our images all having a similiar data distribution. Which makes our models benefit from faster convergence during gradient descent and generalising better.

Normalizing the inputs in our context involves calculating the mean and standard deviation of the training dataset and then applying the following formula to each input: $$ X_{} = \frac{X_{} - μ_{}}{σ_{}} $$

In [ ]:
# use rescaling
normalization_layer = tf.keras.layers.Rescaling(1./255)
normalized_dataset_train_31 = dataset_train_31.map(lambda x, y: (normalization_layer(x), y))

compute_statistics(normalized_dataset_train_31,'Normalised Training Images')
Normalised Training Images
Min Pixel Value: 0.0
Max Pixel Value: 1.0
Mean Pixel Value: 0.448397200505043
Standard Deviation: 0.21720750670021785

We can see that the range of the new normalised pixel values is between 0 - 1

In [ ]:
for images, labels in dataset_train_31.take(1):
    original_images = images

normalized_images = normalization_layer(original_images)

original_image = original_images[0]
normalized_image = normalized_images[0]

fig, ax = plt.subplots(ncols=2, figsize=(10, 5))

ax[0].imshow(original_image.numpy().squeeze(), cmap='gray')
ax[0].set_title('Before Normalization')

ax[1].imshow(normalized_image.numpy().squeeze(), cmap='gray')
ax[1].set_title('After Normalization')

plt.show()
No description has been provided for this image

Observations:

  • We can see that normalization dosent significantly affect the visual appearance of our image. Since the original pixel values were already within the same range as before.

Data Augementation¶

What are image augmentations?¶

It is a technique that artificially enhances the diversty and variability of our image dataset. It involves applying various transformations to our images such as rotations, flips, scaling, brightness adjustments, and cropping. It is mainly to provide our model with a broader range of training examples which improves its abilty to generalise and predict better on unseen data.

Why do we need to augment our images?¶

There are serveral reasons why we need to augment our images.

    1. It increases the amount of images in our train dataset, thus having more "data" for the model to train on.
    1. It helps with reducing overfitting,by exposing our model to a wider range of inputs, which promotes robustness and enhances its ability to handle variations.
Types of Image Augmentations we will be using:¶
  • flipping (horizontal/ vertically)
  • cropping
In [ ]:
def augment_images(image, label, size, seed, flip_lr_prob=0.2, flip_ud_prob=0.2):
    image = tf.map_fn(lambda img: tf.image.random_crop(img, size, seed=seed), image)

    # Randomly flip the image left or right based on the flip_lr_prob
    image = tf.cond(tf.random.uniform([]) < flip_lr_prob, 
                    lambda: tf.image.random_flip_left_right(image, seed=seed), 
                    lambda: image)
    # Randomly flip the image up or down based on the flip_ud_prob
    image = tf.cond(tf.random.uniform([]) < flip_ud_prob, 
                    lambda: tf.image.random_flip_up_down(image, seed=seed), 
                    lambda: image)

    return image, label

size_31 = [31, 31, 1] 
size_128 = [128, 128, 1]
train_generator_31 = dataset_train_31.map(lambda image, label: augment_images(image, label, size_31,seed=seed))
train_generator_128 = dataset_train_128.map(lambda image, label: augment_images(image, label, size_128,seed=seed))
#plot the augmented images

We won't have servere data augmentation, as from my testing, servere data augmentation tends to make the model training very unstable and it sometimes even makes the model worse when generalising to our validation data.

In [ ]:
plot_dataset_huge(42,train_generator_128,'Augmented 128 x 128 images',class_labels)
No description has been provided for this image
In [ ]:
plot_dataset_huge(42,train_generator_31,'Augmented 31 x 31 images',class_labels)
No description has been provided for this image

Observations:

  • We have successfully augmented some of our images, it is visible that some of the images has been flipped and cropped. This will hopefully introduce more variants into our dataset and enable our model to better generalise to our test and validation datasets.

Models¶

How does a CNN differ from a ANN?¶

As the name of a CNN suggests, its convolution! As image data is store in arrays, It is deeply inefffcient and unsatisfying to flatten the whole image into an input layer and just feed it through a neural network. With neural network that recognises images having millions of tunable parameters. CNNs help solve that issue, with convolution and pooling layers!

How does each layer affect our accuracy and efficiency?¶

We have serveral layers we want to look into here:

Convolution Layer(Convo2D)¶

  • They are basically require in our CNN model to extract the features in our images and can learn hierarchical features.
  • However having too much convolution layers without regularization can lead to overfitting :(
  • Convolutional layers are computationally intensive, but their use of shared weights reduces the overall number of parameters compared to fully connected layers, makes them computationally more efficient. :)

Pooling layer¶

  • Pooling layers downsample feature maps from Convolution layers, reducing its spatial dimensions and computational requirements. :)
  • However excessive pooling may lead to information loss, affecting the model's ability to localize features precisely. :(
  • It increases computational efficiency by reducing the spatial dimensions, which can lead to faster training times and convergence. :)

Fully connected layer (Dense)¶

  • They are the main "brain" of our CNN, they are responsible for combining extracted features for final classification and can capture complex relationships in the data. :)
  • Too many parameters in dense layers can lead to overfitting, especially if our dataset is small which in our case it is. :(
  • Dense layers are alot more computationally expensive due to the large number of parameters, possibly slowing down training times. :(

Dropout layer¶

  • Dropout layers prevent overfitting by randomly deactivating a fraction of neurons during training, encouraging our CNN to learn more robust features. :)
  • However if the dropout layer is too aggressive, it may prevent the model to learn any meaningful features or patterns, lowering the accuracy. :(

Models choosen¶

We will be experimenting on different CNN architechtures on our 31 x 31 and 128 x 128 images

  • Convolution 2d Neural Network (base)
  • Custom VG16 Network
  • Custom ResNet Network

We will be comparing our Custom VG16 Network and Custom Resnet Network with our base model and see how it performs against it.

Choosing Optimization Algorithm¶

Our choice of optimization algorithms plays a huge role in training CNN models. The 2 most common optimizers used in TensorFlow are Adam and Stochastic Gradient Descent (SGD). We first need to understand how these 2 optimization algorithms function:

Adam Optimzer

  • Adam optimization is a stochastic gradient descent method that adapts its learning rates for each network weight individually. It is based on adaptive estimation of first-order (mean) and second-order (uncentered variance) moments. Adam is known for its fast convergence and efficiency in handling noisy or sparse gradients [1].

SGD

  • SGD is an method that updates model parameters based on the gradient of the loss function with respect to those parameters. It is a classic optimization algorithm and is known for its simplicity [2].

Our choosen Optimization Algorithm : SGD¶

Why SGD? Eventhough Adam is faster in many cases as compared to SGD, this is due to it updating its learning rates indivdually for each weight and techniques such as coordinate-wise gradient clipping to handle noise effectivly. On the other hand, SGD may out perform Adam in image classification tasks, as Adam takes "shortcuts" where it dosent preserve the fine-grained details to distingush an image.

Therefore we will be using SGD as our optimizer

Overfitting prevention¶

To prevent overfitting, we will be using Early Stopping, as it will stop model training once it begins to overfit. Other strategies include:

  • Data Augmentation
  • Normalisation
  • Dropout layers
  • L1 and L2 Regularization

Does size matter?¶

Does our input image size really matter? what else were you thinking!?

  • Larger input sizes requires more complex models to capture intricate patterns and details in the data. We may need deeper convolution networks to better learn features from our 128 x 128 pictures
  • Smaller input sizes eg 31x31 might result in models that generalize better. Larger inputs eg 128x128 can lead to overfitting, where the model may memorize details specific to the training set but fail to generalize to new data.

In summary, smaller sizes tend to give faster training times as models with fewer parameters converge more swiftly during optimization and is able to generalise better. On the other hand, larger sizes introduce increased model complexity, which enables the capture of the finner details and possibly improving performance on tasks requiring fine-grained information. However, this advantage comes at the cost of longer training times and heightened computational demands.

Utilty Functions¶

In [ ]:
def compare_curves(history1, history2, title1, title2):
    plt.figure(figsize=(16, 6))

    # Loss
    plt.subplot(1, 2, 1)
    plt.plot(history1['loss'], 'o-', label='Train Loss ' + title1)
    plt.plot(history1['val_loss'], 'o-', label='Validation Loss ' + title1)
    plt.plot(history2['loss'], '*--', label='Train Loss ' + title2)
    plt.plot(history2['val_loss'], '*--', label='Validation Loss ' + title2)
    plt.title('Loss Curve Comparison')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.ylim([0, 3])
    plt.legend()

    # Accuracy
    plt.subplot(1, 2, 2)
    plt.plot(history1['accuracy'], 'o-', label='Train Accuracy ' + title1)
    plt.plot(history1['val_accuracy'], 'o-', label='Validation Accuracy ' + title1)
    plt.plot(history2['accuracy'], '*--', label='Train Accuracy ' + title2)
    plt.plot(history2['val_accuracy'], '*--', label='Validation Accuracy ' + title2)
    plt.title('Accuracy Curve Comparison')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.ylim([0, 1])
    plt.legend()

    plt.tight_layout()
    plt.show()

def plot_history(history, title):
    plt.figure(figsize=(16, 6))

    # Loss
    plt.subplot(1, 2, 1)
    plt.plot(history['loss'], 'o-', label='Train Loss')
    plt.plot(history['val_loss'], 'o-', label='Validation Loss')
    plt.title('Loss Curve - ' + title)
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.ylim([0, 3])
    plt.legend()

    # Accuracy
    plt.subplot(1, 2, 2)
    plt.plot(history['accuracy'], 'o-', label='Train Accuracy')
    plt.plot(history['val_accuracy'], 'o-', label='Validation Accuracy')
    plt.title('Accuracy Curve - ' + title)
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.ylim([0, 1])
    plt.legend()

    plt.tight_layout()
    plt.show()

def evaluate_and_save_model(model, model_name, batch_size, save_dir='./models',save_models=False):
    # Create directory if it doesn't exist
    if save_models:
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        # Save the model
        model_path = os.path.join(save_dir, model_name + '.h5')
        #replace the model if it already exists
        if os.path.exists(model_path):
            os.remove(model_path)
        model.save(model_path)
        print('Saved trained model at %s ' % model_path)

        model_history = model.history.history
        if os.path.exists(os.path.join(save_dir, model_name +'_history'+'.json')):
            os.remove(os.path.join(save_dir, model_name + '_history'+'.json'))
        json.dump(model_history, open(os.path.join(save_dir, model_name +'_history'+ '.json'), 'w'))
        print('Saved trained model history at %s ' % os.path.join(save_dir, model_name +'_history'+ '.json'))
    else:
        model_history = model.history.history

    best_val_idx = np.argmax(model_history["val_accuracy"])
    result = {}
    result["Model Name"] = model_name
    result["Epochs"] = len(model_history["loss"])
    result["Batch Size"] = batch_size
    result["Train Loss"] = model_history["loss"][best_val_idx]
    result["Val Loss"] = model_history["val_loss"][best_val_idx]
    result["Train Acc"] = model_history["accuracy"][best_val_idx]
    result["Val Acc"] = model_history["val_accuracy"][best_val_idx]
    result["[Train - Val] Acc"] = result["Train Acc"] - result["Val Acc"]
    result["[Train - Val] Loss"] = result["Train Loss"] - result["Val Loss"]
    result_series = pd.Series(result, name=result["Model Name"])
    print(result_series)
    return

from keras import backend as K
"""
source : https://stackoverflow.com/questions/47680984/does-input-dimension-resolution-affect-the-performance-of-convolutional-neural-n
"""
def recall_m(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision_m(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def f1_m(y_true, y_pred):
    precision = precision_m(y_true, y_pred)
    recall = recall_m(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

Setting Parameters for our model¶

We will be setting the basic parameters for training our model.

  • weight decay
  • steps per epoch
  • learning rate
  • momentum
In [ ]:
weight_decay = 0.0005
steps_per_epoch = len(dataset_train_31) # 9028(total training samples) // 64(batch size) = 142
learning_rate = 0.02
momentum = 0.9

Convo2D Neural Network (Base)¶

We will be using this model as a base to compare our other 2 models in later down the project. It will be a simple model with 2Convo2D and MaxPooling pairs and 2 hidden dense layers each with 128 neurons. The ReLu activation function will be applyed for the hidden layers and softmax for the output layer. As there are multiple category that we are predicting, we will be using the categorical_crossentropy as our loss function. We will be using both F1 and accuracry to measure our model.

Training without Data Augmentation for both 31x31 and 128x128¶

In [ ]:
def create_Basemodel(input_shape, learning_rate, momentum, class_weights_dict, dataset_train, dataset_test, steps_per_epoch):
    tf.keras.backend.clear_session()
    model = Sequential()
    model.add(tf.keras.layers.Rescaling(1./255, input_shape=input_shape))
    model.add(Conv2D(64,(3,3),activation='relu'))
    model.add(MaxPooling2D((2,2)))
    model.add(Conv2D(64,(3,3),activation='relu'))
    model.add(MaxPooling2D((2,2)))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(15, activation='softmax'))
    model.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
    model.fit(dataset_train, epochs=150, validation_data=dataset_test, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
    return model
In [ ]:
%%time
BaseModel_31 = create_Basemodel((31,31,1),learning_rate,momentum,class_weights_dict,dataset_train_31,dataset_test_31,steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 3s 12ms/step - loss: 0.1508 - accuracy: 0.0857 - f1_m: 0.0000e+00 - val_loss: 2.7046 - val_accuracy: 0.0933 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1506 - accuracy: 0.1272 - f1_m: 0.0000e+00 - val_loss: 2.7007 - val_accuracy: 0.0870 - val_f1_m: 0.0000e+00
Epoch 3/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1504 - accuracy: 0.1293 - f1_m: 0.0000e+00 - val_loss: 2.6964 - val_accuracy: 0.1013 - val_f1_m: 0.0000e+00
Epoch 4/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1501 - accuracy: 0.1331 - f1_m: 0.0000e+00 - val_loss: 2.6904 - val_accuracy: 0.1183 - val_f1_m: 0.0000e+00
Epoch 5/150
142/142 [==============================] - 2s 12ms/step - loss: 0.1497 - accuracy: 0.1504 - f1_m: 0.0000e+00 - val_loss: 2.6813 - val_accuracy: 0.1360 - val_f1_m: 0.0000e+00
Epoch 6/150
142/142 [==============================] - 2s 12ms/step - loss: 0.1491 - accuracy: 0.1639 - f1_m: 0.0000e+00 - val_loss: 2.6666 - val_accuracy: 0.1553 - val_f1_m: 0.0000e+00
Epoch 7/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1480 - accuracy: 0.1742 - f1_m: 0.0000e+00 - val_loss: 2.6398 - val_accuracy: 0.1577 - val_f1_m: 0.0000e+00
Epoch 8/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1461 - accuracy: 0.1868 - f1_m: 0.0000e+00 - val_loss: 2.5930 - val_accuracy: 0.1863 - val_f1_m: 0.0000e+00
Epoch 9/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1429 - accuracy: 0.1938 - f1_m: 0.0000e+00 - val_loss: 2.5172 - val_accuracy: 0.1957 - val_f1_m: 0.0000e+00
Epoch 10/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1383 - accuracy: 0.2168 - f1_m: 0.0015 - val_loss: 2.4234 - val_accuracy: 0.2323 - val_f1_m: 0.0033
Epoch 11/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1339 - accuracy: 0.2376 - f1_m: 0.0028 - val_loss: 2.3446 - val_accuracy: 0.2570 - val_f1_m: 0.0163
Epoch 12/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1300 - accuracy: 0.2623 - f1_m: 0.0052 - val_loss: 2.2912 - val_accuracy: 0.2693 - val_f1_m: 0.0130
Epoch 13/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1267 - accuracy: 0.2745 - f1_m: 0.0060 - val_loss: 2.2317 - val_accuracy: 0.2873 - val_f1_m: 0.0180
Epoch 14/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1237 - accuracy: 0.2933 - f1_m: 0.0120 - val_loss: 2.1760 - val_accuracy: 0.3007 - val_f1_m: 0.0194
Epoch 15/150
142/142 [==============================] - 2s 12ms/step - loss: 0.1203 - accuracy: 0.3137 - f1_m: 0.0163 - val_loss: 2.1599 - val_accuracy: 0.3137 - val_f1_m: 0.0587
Epoch 16/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1158 - accuracy: 0.3379 - f1_m: 0.0324 - val_loss: 2.0303 - val_accuracy: 0.3553 - val_f1_m: 0.0777
Epoch 17/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1120 - accuracy: 0.3581 - f1_m: 0.0546 - val_loss: 2.0956 - val_accuracy: 0.3327 - val_f1_m: 0.1427
Epoch 18/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1077 - accuracy: 0.3761 - f1_m: 0.0916 - val_loss: 1.8824 - val_accuracy: 0.4090 - val_f1_m: 0.1070
Epoch 19/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1035 - accuracy: 0.4024 - f1_m: 0.1321 - val_loss: 1.8991 - val_accuracy: 0.3843 - val_f1_m: 0.1372
Epoch 20/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1023 - accuracy: 0.4081 - f1_m: 0.1602 - val_loss: 1.7731 - val_accuracy: 0.4383 - val_f1_m: 0.1983
Epoch 21/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0973 - accuracy: 0.4317 - f1_m: 0.1945 - val_loss: 1.7232 - val_accuracy: 0.4397 - val_f1_m: 0.2384
Epoch 22/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0931 - accuracy: 0.4580 - f1_m: 0.2443 - val_loss: 1.6722 - val_accuracy: 0.4627 - val_f1_m: 0.2828
Epoch 23/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0907 - accuracy: 0.4652 - f1_m: 0.2790 - val_loss: 1.5934 - val_accuracy: 0.4860 - val_f1_m: 0.3227
Epoch 24/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0868 - accuracy: 0.4900 - f1_m: 0.3245 - val_loss: 1.5445 - val_accuracy: 0.5060 - val_f1_m: 0.3501
Epoch 25/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0835 - accuracy: 0.5137 - f1_m: 0.3670 - val_loss: 1.6193 - val_accuracy: 0.4717 - val_f1_m: 0.3807
Epoch 26/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0817 - accuracy: 0.5177 - f1_m: 0.3984 - val_loss: 1.6497 - val_accuracy: 0.4720 - val_f1_m: 0.3620
Epoch 27/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0809 - accuracy: 0.5359 - f1_m: 0.4053 - val_loss: 1.4523 - val_accuracy: 0.5217 - val_f1_m: 0.4362
Epoch 28/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0739 - accuracy: 0.5692 - f1_m: 0.4750 - val_loss: 1.3419 - val_accuracy: 0.5790 - val_f1_m: 0.4878
Epoch 29/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0708 - accuracy: 0.5879 - f1_m: 0.4990 - val_loss: 1.3152 - val_accuracy: 0.5870 - val_f1_m: 0.5143
Epoch 30/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0711 - accuracy: 0.5833 - f1_m: 0.5104 - val_loss: 1.2580 - val_accuracy: 0.6033 - val_f1_m: 0.5406
Epoch 31/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0649 - accuracy: 0.6214 - f1_m: 0.5589 - val_loss: 1.4585 - val_accuracy: 0.5423 - val_f1_m: 0.4957
Epoch 32/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0638 - accuracy: 0.6256 - f1_m: 0.5720 - val_loss: 1.1944 - val_accuracy: 0.6083 - val_f1_m: 0.5562
Epoch 33/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0581 - accuracy: 0.6558 - f1_m: 0.6111 - val_loss: 1.2875 - val_accuracy: 0.5810 - val_f1_m: 0.5446
Epoch 34/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0568 - accuracy: 0.6640 - f1_m: 0.6281 - val_loss: 1.2034 - val_accuracy: 0.6213 - val_f1_m: 0.5944
Epoch 35/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0550 - accuracy: 0.6763 - f1_m: 0.6432 - val_loss: 1.1077 - val_accuracy: 0.6557 - val_f1_m: 0.6175
Epoch 36/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0521 - accuracy: 0.6905 - f1_m: 0.6645 - val_loss: 1.0116 - val_accuracy: 0.6860 - val_f1_m: 0.6621
Epoch 37/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0492 - accuracy: 0.7105 - f1_m: 0.6805 - val_loss: 1.2376 - val_accuracy: 0.5913 - val_f1_m: 0.5691
Epoch 38/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0503 - accuracy: 0.7033 - f1_m: 0.6727 - val_loss: 0.9951 - val_accuracy: 0.6860 - val_f1_m: 0.6704
Epoch 39/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0455 - accuracy: 0.7251 - f1_m: 0.7088 - val_loss: 0.9831 - val_accuracy: 0.6933 - val_f1_m: 0.6708
Epoch 40/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0434 - accuracy: 0.7383 - f1_m: 0.7240 - val_loss: 0.9502 - val_accuracy: 0.6960 - val_f1_m: 0.6859
Epoch 41/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0428 - accuracy: 0.7416 - f1_m: 0.7303 - val_loss: 0.8923 - val_accuracy: 0.7190 - val_f1_m: 0.7073
Epoch 42/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0394 - accuracy: 0.7613 - f1_m: 0.7522 - val_loss: 1.0069 - val_accuracy: 0.6720 - val_f1_m: 0.6601
Epoch 43/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0404 - accuracy: 0.7559 - f1_m: 0.7448 - val_loss: 0.8779 - val_accuracy: 0.7170 - val_f1_m: 0.7071
Epoch 44/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0376 - accuracy: 0.7713 - f1_m: 0.7641 - val_loss: 0.8671 - val_accuracy: 0.7253 - val_f1_m: 0.7197
Epoch 45/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0350 - accuracy: 0.7900 - f1_m: 0.7839 - val_loss: 0.8621 - val_accuracy: 0.7293 - val_f1_m: 0.7284
Epoch 46/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0337 - accuracy: 0.7975 - f1_m: 0.7861 - val_loss: 0.9861 - val_accuracy: 0.7007 - val_f1_m: 0.6970
Epoch 47/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0362 - accuracy: 0.7848 - f1_m: 0.7779 - val_loss: 0.7976 - val_accuracy: 0.7563 - val_f1_m: 0.7562
Epoch 48/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0311 - accuracy: 0.8057 - f1_m: 0.8022 - val_loss: 0.9133 - val_accuracy: 0.7160 - val_f1_m: 0.7145
Epoch 49/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0317 - accuracy: 0.8055 - f1_m: 0.8003 - val_loss: 0.8002 - val_accuracy: 0.7457 - val_f1_m: 0.7485
Epoch 50/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0282 - accuracy: 0.8310 - f1_m: 0.8273 - val_loss: 0.7657 - val_accuracy: 0.7613 - val_f1_m: 0.7632
Epoch 51/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0275 - accuracy: 0.8340 - f1_m: 0.8302 - val_loss: 0.7797 - val_accuracy: 0.7580 - val_f1_m: 0.7556
Epoch 52/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0262 - accuracy: 0.8394 - f1_m: 0.8372 - val_loss: 0.7386 - val_accuracy: 0.7753 - val_f1_m: 0.7688
Epoch 53/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0252 - accuracy: 0.8469 - f1_m: 0.8431 - val_loss: 0.7263 - val_accuracy: 0.7810 - val_f1_m: 0.7803
Epoch 54/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0236 - accuracy: 0.8597 - f1_m: 0.8550 - val_loss: 0.7215 - val_accuracy: 0.7757 - val_f1_m: 0.7828
Epoch 55/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0234 - accuracy: 0.8588 - f1_m: 0.8584 - val_loss: 0.8671 - val_accuracy: 0.7357 - val_f1_m: 0.7381
Epoch 56/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0239 - accuracy: 0.8506 - f1_m: 0.8523 - val_loss: 0.9378 - val_accuracy: 0.7187 - val_f1_m: 0.7199
Epoch 57/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0212 - accuracy: 0.8694 - f1_m: 0.8722 - val_loss: 0.7192 - val_accuracy: 0.7873 - val_f1_m: 0.7918
Epoch 58/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0198 - accuracy: 0.8838 - f1_m: 0.8773 - val_loss: 0.9001 - val_accuracy: 0.7373 - val_f1_m: 0.7374
Epoch 59/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0197 - accuracy: 0.8831 - f1_m: 0.8801 - val_loss: 0.7592 - val_accuracy: 0.7717 - val_f1_m: 0.7733
Epoch 60/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0181 - accuracy: 0.8872 - f1_m: 0.8875 - val_loss: 0.7200 - val_accuracy: 0.7837 - val_f1_m: 0.7901
Epoch 61/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0167 - accuracy: 0.8998 - f1_m: 0.8991 - val_loss: 0.7803 - val_accuracy: 0.7683 - val_f1_m: 0.7697
Epoch 62/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0172 - accuracy: 0.8954 - f1_m: 0.8921 - val_loss: 0.7219 - val_accuracy: 0.7957 - val_f1_m: 0.7961
Epoch 63/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0167 - accuracy: 0.8980 - f1_m: 0.8986 - val_loss: 0.6808 - val_accuracy: 0.8063 - val_f1_m: 0.8059
Epoch 64/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0145 - accuracy: 0.9146 - f1_m: 0.9118 - val_loss: 0.7198 - val_accuracy: 0.8030 - val_f1_m: 0.8043
Epoch 65/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0178 - accuracy: 0.8898 - f1_m: 0.8903 - val_loss: 0.6456 - val_accuracy: 0.8133 - val_f1_m: 0.8169
Epoch 66/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0133 - accuracy: 0.9230 - f1_m: 0.9230 - val_loss: 0.6673 - val_accuracy: 0.8087 - val_f1_m: 0.8114
Epoch 67/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0127 - accuracy: 0.9246 - f1_m: 0.9241 - val_loss: 0.6435 - val_accuracy: 0.8177 - val_f1_m: 0.8196
Epoch 68/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0123 - accuracy: 0.9261 - f1_m: 0.9270 - val_loss: 0.7304 - val_accuracy: 0.7987 - val_f1_m: 0.8013
Epoch 69/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0113 - accuracy: 0.9313 - f1_m: 0.9323 - val_loss: 0.6590 - val_accuracy: 0.8163 - val_f1_m: 0.8211
Epoch 70/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0116 - accuracy: 0.9289 - f1_m: 0.9280 - val_loss: 0.6487 - val_accuracy: 0.8263 - val_f1_m: 0.8291
Epoch 71/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0111 - accuracy: 0.9293 - f1_m: 0.9307 - val_loss: 0.6739 - val_accuracy: 0.8107 - val_f1_m: 0.8130
Epoch 72/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0107 - accuracy: 0.9364 - f1_m: 0.9366 - val_loss: 0.6636 - val_accuracy: 0.8193 - val_f1_m: 0.8227
Epoch 73/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0098 - accuracy: 0.9428 - f1_m: 0.9425 - val_loss: 0.6506 - val_accuracy: 0.8260 - val_f1_m: 0.8325
Epoch 74/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0086 - accuracy: 0.9513 - f1_m: 0.9513 - val_loss: 0.6642 - val_accuracy: 0.8197 - val_f1_m: 0.8246
Epoch 75/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0080 - accuracy: 0.9536 - f1_m: 0.9532 - val_loss: 0.6997 - val_accuracy: 0.8173 - val_f1_m: 0.8211
Epoch 76/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0085 - accuracy: 0.9498 - f1_m: 0.9490 - val_loss: 0.6682 - val_accuracy: 0.8283 - val_f1_m: 0.8335
Epoch 77/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0072 - accuracy: 0.9577 - f1_m: 0.9574 - val_loss: 0.6829 - val_accuracy: 0.8190 - val_f1_m: 0.8245
Epoch 77: early stopping
CPU times: total: 1min 31s
Wall time: 2min 2s
In [ ]:
%%time
BaseModel_128 =  create_Basemodel((128,128,1),learning_rate,momentum,class_weights_dict,dataset_train_128,dataset_test_128,steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 6s 38ms/step - loss: 0.1501 - accuracy: 0.1097 - f1_m: 0.0000e+00 - val_loss: 2.6740 - val_accuracy: 0.1070 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1462 - accuracy: 0.1369 - f1_m: 0.0000e+00 - val_loss: 2.5610 - val_accuracy: 0.1557 - val_f1_m: 0.0013
Epoch 3/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1376 - accuracy: 0.2045 - f1_m: 0.0045 - val_loss: 2.3882 - val_accuracy: 0.2573 - val_f1_m: 0.0143
Epoch 4/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1279 - accuracy: 0.2913 - f1_m: 0.0171 - val_loss: 2.2287 - val_accuracy: 0.3133 - val_f1_m: 0.0567
Epoch 5/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1182 - accuracy: 0.3499 - f1_m: 0.0758 - val_loss: 2.0560 - val_accuracy: 0.3567 - val_f1_m: 0.1162
Epoch 6/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1086 - accuracy: 0.4025 - f1_m: 0.1617 - val_loss: 1.9835 - val_accuracy: 0.3863 - val_f1_m: 0.2103
Epoch 7/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0998 - accuracy: 0.4404 - f1_m: 0.2544 - val_loss: 1.6977 - val_accuracy: 0.4843 - val_f1_m: 0.3251
Epoch 8/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0873 - accuracy: 0.5107 - f1_m: 0.3821 - val_loss: 1.5540 - val_accuracy: 0.5150 - val_f1_m: 0.4163
Epoch 9/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0798 - accuracy: 0.5488 - f1_m: 0.4506 - val_loss: 1.4321 - val_accuracy: 0.5510 - val_f1_m: 0.4723
Epoch 10/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0704 - accuracy: 0.6036 - f1_m: 0.5335 - val_loss: 1.5309 - val_accuracy: 0.5250 - val_f1_m: 0.4842
Epoch 11/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0679 - accuracy: 0.6095 - f1_m: 0.5511 - val_loss: 1.3149 - val_accuracy: 0.5920 - val_f1_m: 0.5598
Epoch 12/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0573 - accuracy: 0.6804 - f1_m: 0.6445 - val_loss: 1.2897 - val_accuracy: 0.6047 - val_f1_m: 0.5782
Epoch 13/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0508 - accuracy: 0.7076 - f1_m: 0.6814 - val_loss: 1.0497 - val_accuracy: 0.6750 - val_f1_m: 0.6606
Epoch 14/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0439 - accuracy: 0.7496 - f1_m: 0.7361 - val_loss: 1.0151 - val_accuracy: 0.6743 - val_f1_m: 0.6627
Epoch 15/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0364 - accuracy: 0.7884 - f1_m: 0.7787 - val_loss: 1.0565 - val_accuracy: 0.6787 - val_f1_m: 0.6762
Epoch 16/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0335 - accuracy: 0.8063 - f1_m: 0.8004 - val_loss: 0.9942 - val_accuracy: 0.6933 - val_f1_m: 0.6880
Epoch 17/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0272 - accuracy: 0.8444 - f1_m: 0.8407 - val_loss: 0.8720 - val_accuracy: 0.7370 - val_f1_m: 0.7375
Epoch 18/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0254 - accuracy: 0.8520 - f1_m: 0.8480 - val_loss: 0.9285 - val_accuracy: 0.7283 - val_f1_m: 0.7267
Epoch 19/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0221 - accuracy: 0.8705 - f1_m: 0.8708 - val_loss: 0.8814 - val_accuracy: 0.7360 - val_f1_m: 0.7415
Epoch 20/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0168 - accuracy: 0.9010 - f1_m: 0.9012 - val_loss: 0.9298 - val_accuracy: 0.7370 - val_f1_m: 0.7399
Epoch 21/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0148 - accuracy: 0.9156 - f1_m: 0.9150 - val_loss: 0.9457 - val_accuracy: 0.7377 - val_f1_m: 0.7400
Epoch 22/150
142/142 [==============================] - 6s 38ms/step - loss: 0.0128 - accuracy: 0.9277 - f1_m: 0.9276 - val_loss: 0.9230 - val_accuracy: 0.7470 - val_f1_m: 0.7510
Epoch 23/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0102 - accuracy: 0.9448 - f1_m: 0.9445 - val_loss: 0.8486 - val_accuracy: 0.7767 - val_f1_m: 0.7809
Epoch 24/150
142/142 [==============================] - 6s 38ms/step - loss: 0.0078 - accuracy: 0.9589 - f1_m: 0.9592 - val_loss: 0.8939 - val_accuracy: 0.7603 - val_f1_m: 0.7691
Epoch 25/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0066 - accuracy: 0.9684 - f1_m: 0.9676 - val_loss: 0.9343 - val_accuracy: 0.7583 - val_f1_m: 0.7621
Epoch 26/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0054 - accuracy: 0.9765 - f1_m: 0.9765 - val_loss: 0.9103 - val_accuracy: 0.7797 - val_f1_m: 0.7794
Epoch 27/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0043 - accuracy: 0.9822 - f1_m: 0.9818 - val_loss: 0.9319 - val_accuracy: 0.7710 - val_f1_m: 0.7763
Epoch 28/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0034 - accuracy: 0.9878 - f1_m: 0.9872 - val_loss: 1.0080 - val_accuracy: 0.7583 - val_f1_m: 0.7614
Epoch 29/150
142/142 [==============================] - 6s 39ms/step - loss: 0.0027 - accuracy: 0.9888 - f1_m: 0.9884 - val_loss: 0.9778 - val_accuracy: 0.7640 - val_f1_m: 0.7708
Epoch 30/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0019 - accuracy: 0.9951 - f1_m: 0.9946 - val_loss: 0.9594 - val_accuracy: 0.7840 - val_f1_m: 0.7898
Epoch 31/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0022 - accuracy: 0.9929 - f1_m: 0.9927 - val_loss: 1.0206 - val_accuracy: 0.7727 - val_f1_m: 0.7766
Epoch 32/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0015 - accuracy: 0.9958 - f1_m: 0.9959 - val_loss: 0.9812 - val_accuracy: 0.7863 - val_f1_m: 0.7894
Epoch 33/150
142/142 [==============================] - 6s 41ms/step - loss: 0.0017 - accuracy: 0.9950 - f1_m: 0.9953 - val_loss: 1.1993 - val_accuracy: 0.7537 - val_f1_m: 0.7558
Epoch 33: early stopping
CPU times: total: 1min 20s
Wall time: 2min 59s
In [ ]:
BaseModel_128.summary()
BaseModel_31.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 rescaling (Rescaling)       (None, 128, 128, 1)       0         
                                                                 
 conv2d (Conv2D)             (None, 126, 126, 64)      640       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 63, 63, 64)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 61, 61, 64)        36928     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 30, 30, 64)       0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 57600)             0         
                                                                 
 dense (Dense)               (None, 128)               7372928   
                                                                 
 dense_1 (Dense)             (None, 128)               16512     
                                                                 
 dense_2 (Dense)             (None, 15)                1935      
                                                                 
=================================================================
Total params: 7,428,943
Trainable params: 7,428,943
Non-trainable params: 0
_________________________________________________________________
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 rescaling (Rescaling)       (None, 31, 31, 1)         0         
                                                                 
 conv2d (Conv2D)             (None, 29, 29, 64)        640       
                                                                 
 max_pooling2d (MaxPooling2D  (None, 14, 14, 64)       0         
 )                                                               
                                                                 
 conv2d_1 (Conv2D)           (None, 12, 12, 64)        36928     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 6, 6, 64)         0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 2304)              0         
                                                                 
 dense (Dense)               (None, 128)               295040    
                                                                 
 dense_1 (Dense)             (None, 128)               16512     
                                                                 
 dense_2 (Dense)             (None, 15)                1935      
                                                                 
=================================================================
Total params: 351,055
Trainable params: 351,055
Non-trainable params: 0
_________________________________________________________________

Observations:

  • We can see that the bigger the input size greatly increases the number of parameters we need to train, thus increasing the training time and likely hood of overfitting in the bigger input size.
In [ ]:
# evaluate_and_save_model(model, model.history, 'BaseModel', 64)
evaluate_and_save_model(BaseModel_128, 'BaseModel_128', 64,save_models=False)
evaluate_and_save_model(BaseModel_31, 'BaseModel_31', 64,save_models=False)
Model Name            BaseModel_128
Epochs                           33
Batch Size                       64
Train Loss                 0.001543
Val Loss                   0.981181
Train Acc                  0.995791
Val Acc                    0.786333
[Train - Val] Acc          0.209458
[Train - Val] Loss        -0.979638
Name: BaseModel_128, dtype: object
Model Name            BaseModel_31
Epochs                          77
Batch Size                      64
Train Loss                0.008457
Val Loss                  0.668227
Train Acc                 0.949823
Val Acc                   0.828333
[Train - Val] Acc         0.121489
[Train - Val] Loss        -0.65977
Name: BaseModel_31, dtype: object
In [ ]:
baseline_128_history = json.load(open('./models/BaseModel_128_history.json', 'r'))
baseline_31_history = json.load(open('./models/BaseModel_31_history.json', 'r'))
In [ ]:
compare_curves(baseline_31_history, baseline_128_history, '31x31', '128x128')
No description has been provided for this image

Obersevations:

  • We can see as when the model increases in epochs, it becomes more generalise and our loss functions starts decreasing as well. However we can see that our model starts to overfit around the 30 epoch mark. We will be comparing and utilising the different overfiting prevention stratergiers latter on in the project.
  • As expected , our 128x128 model overfitts alot more and alot faster, thus stopping relatively early during training.

Training with Data Augmentation¶

We will now train our baseline model on the dataset that we have augmented

In [ ]:
%%time
BaseModel_128_DA = create_Basemodel((128,128,1),learning_rate,momentum,class_weights_dict,train_generator_128,dataset_test_128,steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 6s 39ms/step - loss: 0.1504 - accuracy: 0.1002 - f1_m: 0.0000e+00 - val_loss: 2.6894 - val_accuracy: 0.1050 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1484 - accuracy: 0.1263 - f1_m: 0.0000e+00 - val_loss: 2.6209 - val_accuracy: 0.1107 - val_f1_m: 0.0000e+00
Epoch 3/150
142/142 [==============================] - 5s 38ms/step - loss: 0.1431 - accuracy: 0.1542 - f1_m: 0.0000e+00 - val_loss: 2.5045 - val_accuracy: 0.1923 - val_f1_m: 0.0000e+00
Epoch 4/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1376 - accuracy: 0.2087 - f1_m: 0.0022 - val_loss: 2.3925 - val_accuracy: 0.2300 - val_f1_m: 0.0141
Epoch 5/150
142/142 [==============================] - 6s 44ms/step - loss: 0.1306 - accuracy: 0.2807 - f1_m: 0.0109 - val_loss: 2.2512 - val_accuracy: 0.2987 - val_f1_m: 0.0596
Epoch 6/150
142/142 [==============================] - 6s 38ms/step - loss: 0.1244 - accuracy: 0.3097 - f1_m: 0.0316 - val_loss: 2.1014 - val_accuracy: 0.3280 - val_f1_m: 0.0901
Epoch 7/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1165 - accuracy: 0.3501 - f1_m: 0.0778 - val_loss: 2.0123 - val_accuracy: 0.3537 - val_f1_m: 0.1620
Epoch 8/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1090 - accuracy: 0.3769 - f1_m: 0.1493 - val_loss: 1.8024 - val_accuracy: 0.4157 - val_f1_m: 0.2663
Epoch 9/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0995 - accuracy: 0.4322 - f1_m: 0.2444 - val_loss: 1.6714 - val_accuracy: 0.4643 - val_f1_m: 0.3240
Epoch 10/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0912 - accuracy: 0.4750 - f1_m: 0.3230 - val_loss: 1.5203 - val_accuracy: 0.5193 - val_f1_m: 0.4070
Epoch 11/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0843 - accuracy: 0.5079 - f1_m: 0.4080 - val_loss: 1.4304 - val_accuracy: 0.5500 - val_f1_m: 0.4468
Epoch 12/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0779 - accuracy: 0.5544 - f1_m: 0.4647 - val_loss: 1.4116 - val_accuracy: 0.5510 - val_f1_m: 0.4897
Epoch 13/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0728 - accuracy: 0.5829 - f1_m: 0.5198 - val_loss: 1.2663 - val_accuracy: 0.5933 - val_f1_m: 0.5450
Epoch 14/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0660 - accuracy: 0.6206 - f1_m: 0.5715 - val_loss: 1.0937 - val_accuracy: 0.6513 - val_f1_m: 0.6162
Epoch 15/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0659 - accuracy: 0.6314 - f1_m: 0.5842 - val_loss: 1.2162 - val_accuracy: 0.6163 - val_f1_m: 0.5645
Epoch 16/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0567 - accuracy: 0.6804 - f1_m: 0.6487 - val_loss: 1.0605 - val_accuracy: 0.6640 - val_f1_m: 0.6474
Epoch 17/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0557 - accuracy: 0.6808 - f1_m: 0.6565 - val_loss: 1.1775 - val_accuracy: 0.6270 - val_f1_m: 0.6025
Epoch 18/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0513 - accuracy: 0.7134 - f1_m: 0.6940 - val_loss: 1.2015 - val_accuracy: 0.6107 - val_f1_m: 0.6081
Epoch 19/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0480 - accuracy: 0.7288 - f1_m: 0.7120 - val_loss: 0.9158 - val_accuracy: 0.7107 - val_f1_m: 0.6936
Epoch 20/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0457 - accuracy: 0.7376 - f1_m: 0.7229 - val_loss: 0.8654 - val_accuracy: 0.7343 - val_f1_m: 0.7226
Epoch 21/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0439 - accuracy: 0.7560 - f1_m: 0.7488 - val_loss: 0.8005 - val_accuracy: 0.7553 - val_f1_m: 0.7490
Epoch 22/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0377 - accuracy: 0.7925 - f1_m: 0.7872 - val_loss: 0.8373 - val_accuracy: 0.7453 - val_f1_m: 0.7322
Epoch 23/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0358 - accuracy: 0.7996 - f1_m: 0.7956 - val_loss: 0.8612 - val_accuracy: 0.7290 - val_f1_m: 0.7269
Epoch 24/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0347 - accuracy: 0.8077 - f1_m: 0.8043 - val_loss: 0.7286 - val_accuracy: 0.7793 - val_f1_m: 0.7689
Epoch 25/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0317 - accuracy: 0.8300 - f1_m: 0.8243 - val_loss: 0.7566 - val_accuracy: 0.7707 - val_f1_m: 0.7686
Epoch 26/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0291 - accuracy: 0.8392 - f1_m: 0.8354 - val_loss: 1.0943 - val_accuracy: 0.6680 - val_f1_m: 0.6647
Epoch 27/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0298 - accuracy: 0.8403 - f1_m: 0.8398 - val_loss: 0.7092 - val_accuracy: 0.7830 - val_f1_m: 0.7797
Epoch 28/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0257 - accuracy: 0.8632 - f1_m: 0.8612 - val_loss: 0.7285 - val_accuracy: 0.7823 - val_f1_m: 0.7814
Epoch 29/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0244 - accuracy: 0.8720 - f1_m: 0.8712 - val_loss: 0.6764 - val_accuracy: 0.7953 - val_f1_m: 0.7906
Epoch 30/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0232 - accuracy: 0.8762 - f1_m: 0.8718 - val_loss: 0.7543 - val_accuracy: 0.7740 - val_f1_m: 0.7761
Epoch 31/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0225 - accuracy: 0.8811 - f1_m: 0.8801 - val_loss: 0.6405 - val_accuracy: 0.8127 - val_f1_m: 0.8153
Epoch 32/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0214 - accuracy: 0.8872 - f1_m: 0.8836 - val_loss: 0.6882 - val_accuracy: 0.7950 - val_f1_m: 0.7968
Epoch 33/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0251 - accuracy: 0.8679 - f1_m: 0.8650 - val_loss: 0.6519 - val_accuracy: 0.7997 - val_f1_m: 0.8110
Epoch 34/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0200 - accuracy: 0.8910 - f1_m: 0.8920 - val_loss: 0.7155 - val_accuracy: 0.7843 - val_f1_m: 0.7836
Epoch 35/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0174 - accuracy: 0.9088 - f1_m: 0.9101 - val_loss: 0.6304 - val_accuracy: 0.8163 - val_f1_m: 0.8172
Epoch 36/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0172 - accuracy: 0.9075 - f1_m: 0.9087 - val_loss: 0.6263 - val_accuracy: 0.8110 - val_f1_m: 0.8169
Epoch 37/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0174 - accuracy: 0.9136 - f1_m: 0.9136 - val_loss: 0.6344 - val_accuracy: 0.8100 - val_f1_m: 0.8082
Epoch 38/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0148 - accuracy: 0.9231 - f1_m: 0.9242 - val_loss: 0.6647 - val_accuracy: 0.8013 - val_f1_m: 0.8066
Epoch 39/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0139 - accuracy: 0.9324 - f1_m: 0.9296 - val_loss: 0.6273 - val_accuracy: 0.8203 - val_f1_m: 0.8219
Epoch 40/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0150 - accuracy: 0.9216 - f1_m: 0.9212 - val_loss: 0.6279 - val_accuracy: 0.8200 - val_f1_m: 0.8208
Epoch 41/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0140 - accuracy: 0.9303 - f1_m: 0.9323 - val_loss: 0.6270 - val_accuracy: 0.8217 - val_f1_m: 0.8230
Epoch 42/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0127 - accuracy: 0.9350 - f1_m: 0.9376 - val_loss: 0.6090 - val_accuracy: 0.8307 - val_f1_m: 0.8297
Epoch 43/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0126 - accuracy: 0.9344 - f1_m: 0.9367 - val_loss: 0.6030 - val_accuracy: 0.8243 - val_f1_m: 0.8305
Epoch 44/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0121 - accuracy: 0.9413 - f1_m: 0.9430 - val_loss: 0.6134 - val_accuracy: 0.8290 - val_f1_m: 0.8276
Epoch 45/150
142/142 [==============================] - 5s 38ms/step - loss: 0.0114 - accuracy: 0.9436 - f1_m: 0.9458 - val_loss: 0.5909 - val_accuracy: 0.8353 - val_f1_m: 0.8370
Epoch 46/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0132 - accuracy: 0.9325 - f1_m: 0.9340 - val_loss: 0.6309 - val_accuracy: 0.8217 - val_f1_m: 0.8251
Epoch 47/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0114 - accuracy: 0.9428 - f1_m: 0.9437 - val_loss: 0.6017 - val_accuracy: 0.8303 - val_f1_m: 0.8328
Epoch 48/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0097 - accuracy: 0.9517 - f1_m: 0.9530 - val_loss: 0.5916 - val_accuracy: 0.8383 - val_f1_m: 0.8412
Epoch 49/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0096 - accuracy: 0.9504 - f1_m: 0.9523 - val_loss: 0.6007 - val_accuracy: 0.8333 - val_f1_m: 0.8374
Epoch 50/150
142/142 [==============================] - 5s 37ms/step - loss: 0.0085 - accuracy: 0.9558 - f1_m: 0.9559 - val_loss: 0.6444 - val_accuracy: 0.8247 - val_f1_m: 0.8257
Epoch 51/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0085 - accuracy: 0.9562 - f1_m: 0.9572 - val_loss: 0.6209 - val_accuracy: 0.8243 - val_f1_m: 0.8266
Epoch 52/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0083 - accuracy: 0.9575 - f1_m: 0.9591 - val_loss: 0.6027 - val_accuracy: 0.8420 - val_f1_m: 0.8464
Epoch 53/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0093 - accuracy: 0.9547 - f1_m: 0.9555 - val_loss: 0.6065 - val_accuracy: 0.8333 - val_f1_m: 0.8398
Epoch 54/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0069 - accuracy: 0.9663 - f1_m: 0.9676 - val_loss: 0.7177 - val_accuracy: 0.8070 - val_f1_m: 0.8123
Epoch 55/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0074 - accuracy: 0.9633 - f1_m: 0.9641 - val_loss: 0.6570 - val_accuracy: 0.8240 - val_f1_m: 0.8265
Epoch 55: early stopping
CPU times: total: 2min 22s
Wall time: 4min 56s
In [ ]:
%%time
BaseModel_31_DA = create_Basemodel((31,31,1),learning_rate,momentum,class_weights_dict,train_generator_31,dataset_test_31,steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 2s 12ms/step - loss: 0.1508 - accuracy: 0.0793 - f1_m: 0.0000e+00 - val_loss: 2.7048 - val_accuracy: 0.0827 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 2s 13ms/step - loss: 0.1506 - accuracy: 0.0969 - f1_m: 0.0000e+00 - val_loss: 2.7015 - val_accuracy: 0.1107 - val_f1_m: 0.0000e+00
Epoch 3/150
142/142 [==============================] - 2s 12ms/step - loss: 0.1504 - accuracy: 0.1211 - f1_m: 0.0000e+00 - val_loss: 2.6979 - val_accuracy: 0.1223 - val_f1_m: 0.0000e+00
Epoch 4/150
142/142 [==============================] - 2s 12ms/step - loss: 0.1502 - accuracy: 0.1382 - f1_m: 0.0000e+00 - val_loss: 2.6924 - val_accuracy: 0.1310 - val_f1_m: 0.0000e+00
Epoch 5/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1498 - accuracy: 0.1539 - f1_m: 0.0000e+00 - val_loss: 2.6830 - val_accuracy: 0.1590 - val_f1_m: 0.0000e+00
Epoch 6/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1492 - accuracy: 0.1513 - f1_m: 0.0000e+00 - val_loss: 2.6671 - val_accuracy: 0.1563 - val_f1_m: 0.0000e+00
Epoch 7/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1481 - accuracy: 0.1601 - f1_m: 0.0000e+00 - val_loss: 2.6405 - val_accuracy: 0.1490 - val_f1_m: 0.0000e+00
Epoch 8/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1462 - accuracy: 0.1696 - f1_m: 0.0000e+00 - val_loss: 2.5919 - val_accuracy: 0.1670 - val_f1_m: 0.0000e+00
Epoch 9/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1429 - accuracy: 0.1868 - f1_m: 0.0000e+00 - val_loss: 2.5146 - val_accuracy: 0.1967 - val_f1_m: 0.0000e+00
Epoch 10/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1391 - accuracy: 0.1975 - f1_m: 4.3337e-04 - val_loss: 2.4319 - val_accuracy: 0.2197 - val_f1_m: 0.0033
Epoch 11/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1353 - accuracy: 0.2228 - f1_m: 0.0039 - val_loss: 2.3982 - val_accuracy: 0.2200 - val_f1_m: 0.0033
Epoch 12/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1331 - accuracy: 0.2390 - f1_m: 0.0065 - val_loss: 2.3215 - val_accuracy: 0.2597 - val_f1_m: 0.0129
Epoch 13/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1307 - accuracy: 0.2479 - f1_m: 0.0077 - val_loss: 2.2925 - val_accuracy: 0.2567 - val_f1_m: 0.0181
Epoch 14/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1288 - accuracy: 0.2626 - f1_m: 0.0107 - val_loss: 2.2521 - val_accuracy: 0.2903 - val_f1_m: 0.0193
Epoch 15/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1268 - accuracy: 0.2727 - f1_m: 0.0105 - val_loss: 2.2161 - val_accuracy: 0.2930 - val_f1_m: 0.0301
Epoch 16/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1245 - accuracy: 0.2913 - f1_m: 0.0133 - val_loss: 2.1734 - val_accuracy: 0.2943 - val_f1_m: 0.0388
Epoch 17/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1224 - accuracy: 0.3070 - f1_m: 0.0159 - val_loss: 2.1592 - val_accuracy: 0.3143 - val_f1_m: 0.0537
Epoch 18/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1195 - accuracy: 0.3144 - f1_m: 0.0256 - val_loss: 2.0639 - val_accuracy: 0.3213 - val_f1_m: 0.0712
Epoch 19/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1153 - accuracy: 0.3427 - f1_m: 0.0444 - val_loss: 2.0013 - val_accuracy: 0.3580 - val_f1_m: 0.0651
Epoch 20/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1124 - accuracy: 0.3611 - f1_m: 0.0634 - val_loss: 1.9307 - val_accuracy: 0.3773 - val_f1_m: 0.1251
Epoch 21/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1080 - accuracy: 0.3809 - f1_m: 0.1031 - val_loss: 1.9014 - val_accuracy: 0.3747 - val_f1_m: 0.1666
Epoch 22/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1039 - accuracy: 0.4014 - f1_m: 0.1482 - val_loss: 1.7614 - val_accuracy: 0.4287 - val_f1_m: 0.2016
Epoch 23/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1003 - accuracy: 0.4181 - f1_m: 0.1787 - val_loss: 1.6786 - val_accuracy: 0.4643 - val_f1_m: 0.2329
Epoch 24/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0973 - accuracy: 0.4366 - f1_m: 0.2212 - val_loss: 1.6230 - val_accuracy: 0.4830 - val_f1_m: 0.2731
Epoch 25/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0939 - accuracy: 0.4489 - f1_m: 0.2622 - val_loss: 1.5673 - val_accuracy: 0.4923 - val_f1_m: 0.3194
Epoch 26/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0894 - accuracy: 0.4776 - f1_m: 0.3120 - val_loss: 1.5119 - val_accuracy: 0.5077 - val_f1_m: 0.3641
Epoch 27/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0878 - accuracy: 0.4899 - f1_m: 0.3417 - val_loss: 1.4682 - val_accuracy: 0.5330 - val_f1_m: 0.4041
Epoch 28/150
142/142 [==============================] - 1s 9ms/step - loss: 0.0834 - accuracy: 0.5123 - f1_m: 0.3817 - val_loss: 1.8727 - val_accuracy: 0.3927 - val_f1_m: 0.3151
Epoch 29/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0827 - accuracy: 0.5062 - f1_m: 0.3943 - val_loss: 1.6014 - val_accuracy: 0.4813 - val_f1_m: 0.3869
Epoch 30/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0796 - accuracy: 0.5284 - f1_m: 0.4210 - val_loss: 1.3489 - val_accuracy: 0.5577 - val_f1_m: 0.4683
Epoch 31/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0775 - accuracy: 0.5407 - f1_m: 0.4477 - val_loss: 1.4562 - val_accuracy: 0.5323 - val_f1_m: 0.4606
Epoch 32/150
142/142 [==============================] - 1s 9ms/step - loss: 0.0761 - accuracy: 0.5436 - f1_m: 0.4566 - val_loss: 1.3154 - val_accuracy: 0.5783 - val_f1_m: 0.5007
Epoch 33/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0737 - accuracy: 0.5629 - f1_m: 0.4820 - val_loss: 1.2723 - val_accuracy: 0.5853 - val_f1_m: 0.5270
Epoch 34/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0702 - accuracy: 0.5860 - f1_m: 0.5142 - val_loss: 1.1762 - val_accuracy: 0.6250 - val_f1_m: 0.5649
Epoch 35/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0688 - accuracy: 0.5908 - f1_m: 0.5268 - val_loss: 1.6810 - val_accuracy: 0.4637 - val_f1_m: 0.4192
Epoch 36/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0665 - accuracy: 0.6061 - f1_m: 0.5435 - val_loss: 1.2759 - val_accuracy: 0.5880 - val_f1_m: 0.5301
Epoch 37/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0652 - accuracy: 0.6138 - f1_m: 0.5557 - val_loss: 1.2535 - val_accuracy: 0.6020 - val_f1_m: 0.5501
Epoch 38/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0635 - accuracy: 0.6258 - f1_m: 0.5729 - val_loss: 1.1106 - val_accuracy: 0.6397 - val_f1_m: 0.6023
Epoch 39/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0610 - accuracy: 0.6402 - f1_m: 0.5897 - val_loss: 1.1760 - val_accuracy: 0.6217 - val_f1_m: 0.5791
Epoch 40/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0598 - accuracy: 0.6480 - f1_m: 0.6143 - val_loss: 1.0238 - val_accuracy: 0.6710 - val_f1_m: 0.6394
Epoch 41/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0576 - accuracy: 0.6619 - f1_m: 0.6215 - val_loss: 1.3931 - val_accuracy: 0.5470 - val_f1_m: 0.5096
Epoch 42/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0577 - accuracy: 0.6580 - f1_m: 0.6260 - val_loss: 1.0681 - val_accuracy: 0.6627 - val_f1_m: 0.6250
Epoch 43/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0548 - accuracy: 0.6745 - f1_m: 0.6432 - val_loss: 0.9726 - val_accuracy: 0.6923 - val_f1_m: 0.6661
Epoch 44/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0532 - accuracy: 0.6891 - f1_m: 0.6568 - val_loss: 0.8974 - val_accuracy: 0.7193 - val_f1_m: 0.6964
Epoch 45/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0512 - accuracy: 0.7018 - f1_m: 0.6750 - val_loss: 0.8941 - val_accuracy: 0.7227 - val_f1_m: 0.7013
Epoch 46/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0509 - accuracy: 0.7005 - f1_m: 0.6785 - val_loss: 1.0210 - val_accuracy: 0.6767 - val_f1_m: 0.6593
Epoch 47/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0515 - accuracy: 0.6976 - f1_m: 0.6680 - val_loss: 0.9996 - val_accuracy: 0.6800 - val_f1_m: 0.6668
Epoch 48/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0486 - accuracy: 0.7137 - f1_m: 0.6931 - val_loss: 0.8632 - val_accuracy: 0.7227 - val_f1_m: 0.7114
Epoch 49/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0466 - accuracy: 0.7342 - f1_m: 0.7098 - val_loss: 0.9263 - val_accuracy: 0.7050 - val_f1_m: 0.6927
Epoch 50/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0460 - accuracy: 0.7286 - f1_m: 0.7066 - val_loss: 0.8345 - val_accuracy: 0.7360 - val_f1_m: 0.7204
Epoch 51/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0456 - accuracy: 0.7295 - f1_m: 0.7110 - val_loss: 1.2324 - val_accuracy: 0.6007 - val_f1_m: 0.5911
Epoch 52/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0452 - accuracy: 0.7324 - f1_m: 0.7163 - val_loss: 0.7865 - val_accuracy: 0.7553 - val_f1_m: 0.7440
Epoch 53/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0425 - accuracy: 0.7486 - f1_m: 0.7385 - val_loss: 0.9750 - val_accuracy: 0.6930 - val_f1_m: 0.6866
Epoch 54/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0435 - accuracy: 0.7386 - f1_m: 0.7262 - val_loss: 0.8523 - val_accuracy: 0.7400 - val_f1_m: 0.7274
Epoch 55/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0412 - accuracy: 0.7579 - f1_m: 0.7453 - val_loss: 0.7668 - val_accuracy: 0.7530 - val_f1_m: 0.7473
Epoch 56/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0391 - accuracy: 0.7712 - f1_m: 0.7651 - val_loss: 0.8249 - val_accuracy: 0.7290 - val_f1_m: 0.7329
Epoch 57/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0389 - accuracy: 0.7764 - f1_m: 0.7681 - val_loss: 0.7121 - val_accuracy: 0.7803 - val_f1_m: 0.7702
Epoch 58/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0398 - accuracy: 0.7660 - f1_m: 0.7536 - val_loss: 0.8234 - val_accuracy: 0.7367 - val_f1_m: 0.7361
Epoch 59/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0394 - accuracy: 0.7720 - f1_m: 0.7595 - val_loss: 0.7429 - val_accuracy: 0.7620 - val_f1_m: 0.7556
Epoch 60/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0364 - accuracy: 0.7899 - f1_m: 0.7827 - val_loss: 0.7232 - val_accuracy: 0.7727 - val_f1_m: 0.7674
Epoch 61/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0352 - accuracy: 0.7920 - f1_m: 0.7818 - val_loss: 0.6849 - val_accuracy: 0.7827 - val_f1_m: 0.7763
Epoch 62/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0353 - accuracy: 0.7954 - f1_m: 0.7898 - val_loss: 0.7853 - val_accuracy: 0.7533 - val_f1_m: 0.7467
Epoch 63/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0353 - accuracy: 0.7912 - f1_m: 0.7862 - val_loss: 0.6773 - val_accuracy: 0.7917 - val_f1_m: 0.7869
Epoch 64/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0338 - accuracy: 0.8023 - f1_m: 0.7959 - val_loss: 0.6696 - val_accuracy: 0.7910 - val_f1_m: 0.7843
Epoch 65/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0341 - accuracy: 0.8043 - f1_m: 0.7933 - val_loss: 0.7280 - val_accuracy: 0.7637 - val_f1_m: 0.7614
Epoch 66/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0328 - accuracy: 0.8105 - f1_m: 0.8039 - val_loss: 0.6342 - val_accuracy: 0.8083 - val_f1_m: 0.8008
Epoch 67/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0312 - accuracy: 0.8179 - f1_m: 0.8146 - val_loss: 0.6580 - val_accuracy: 0.7893 - val_f1_m: 0.7898
Epoch 68/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0298 - accuracy: 0.8284 - f1_m: 0.8226 - val_loss: 0.6354 - val_accuracy: 0.7963 - val_f1_m: 0.7984
Epoch 69/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0314 - accuracy: 0.8172 - f1_m: 0.8141 - val_loss: 0.6658 - val_accuracy: 0.7957 - val_f1_m: 0.7931
Epoch 70/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0298 - accuracy: 0.8262 - f1_m: 0.8215 - val_loss: 0.6169 - val_accuracy: 0.8057 - val_f1_m: 0.8048
Epoch 71/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0293 - accuracy: 0.8324 - f1_m: 0.8301 - val_loss: 0.6590 - val_accuracy: 0.7980 - val_f1_m: 0.7968
Epoch 72/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0298 - accuracy: 0.8265 - f1_m: 0.8250 - val_loss: 0.7041 - val_accuracy: 0.7757 - val_f1_m: 0.7759
Epoch 73/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0274 - accuracy: 0.8415 - f1_m: 0.8401 - val_loss: 0.6140 - val_accuracy: 0.8087 - val_f1_m: 0.8096
Epoch 74/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0280 - accuracy: 0.8367 - f1_m: 0.8330 - val_loss: 0.6269 - val_accuracy: 0.8050 - val_f1_m: 0.8046
Epoch 75/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0260 - accuracy: 0.8516 - f1_m: 0.8516 - val_loss: 0.6583 - val_accuracy: 0.7990 - val_f1_m: 0.8003
Epoch 76/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0238 - accuracy: 0.8623 - f1_m: 0.8588 - val_loss: 0.6901 - val_accuracy: 0.7887 - val_f1_m: 0.7844
Epoch 77/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0263 - accuracy: 0.8485 - f1_m: 0.8442 - val_loss: 0.6238 - val_accuracy: 0.8107 - val_f1_m: 0.8099
Epoch 78/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0251 - accuracy: 0.8593 - f1_m: 0.8548 - val_loss: 0.5692 - val_accuracy: 0.8227 - val_f1_m: 0.8219
Epoch 79/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0237 - accuracy: 0.8683 - f1_m: 0.8659 - val_loss: 0.6480 - val_accuracy: 0.8087 - val_f1_m: 0.8068
Epoch 80/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0236 - accuracy: 0.8639 - f1_m: 0.8647 - val_loss: 0.6324 - val_accuracy: 0.8027 - val_f1_m: 0.8020
Epoch 81/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0234 - accuracy: 0.8623 - f1_m: 0.8621 - val_loss: 0.6136 - val_accuracy: 0.8100 - val_f1_m: 0.8134
Epoch 82/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0237 - accuracy: 0.8670 - f1_m: 0.8661 - val_loss: 0.6808 - val_accuracy: 0.7907 - val_f1_m: 0.7936
Epoch 83/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0230 - accuracy: 0.8694 - f1_m: 0.8654 - val_loss: 0.6523 - val_accuracy: 0.8033 - val_f1_m: 0.8031
Epoch 84/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0236 - accuracy: 0.8630 - f1_m: 0.8620 - val_loss: 0.5474 - val_accuracy: 0.8283 - val_f1_m: 0.8350
Epoch 85/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0207 - accuracy: 0.8775 - f1_m: 0.8786 - val_loss: 0.6080 - val_accuracy: 0.8167 - val_f1_m: 0.8185
Epoch 86/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0208 - accuracy: 0.8814 - f1_m: 0.8783 - val_loss: 0.5813 - val_accuracy: 0.8327 - val_f1_m: 0.8338
Epoch 87/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0204 - accuracy: 0.8844 - f1_m: 0.8852 - val_loss: 0.5793 - val_accuracy: 0.8273 - val_f1_m: 0.8285
Epoch 88/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0212 - accuracy: 0.8788 - f1_m: 0.8797 - val_loss: 0.6321 - val_accuracy: 0.8143 - val_f1_m: 0.8150
Epoch 89/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0208 - accuracy: 0.8824 - f1_m: 0.8814 - val_loss: 0.5613 - val_accuracy: 0.8337 - val_f1_m: 0.8329
Epoch 90/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0189 - accuracy: 0.8906 - f1_m: 0.8903 - val_loss: 0.5963 - val_accuracy: 0.8183 - val_f1_m: 0.8229
Epoch 91/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0216 - accuracy: 0.8793 - f1_m: 0.8786 - val_loss: 0.5845 - val_accuracy: 0.8247 - val_f1_m: 0.8269
Epoch 92/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0190 - accuracy: 0.8909 - f1_m: 0.8915 - val_loss: 0.5597 - val_accuracy: 0.8327 - val_f1_m: 0.8356
Epoch 93/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0186 - accuracy: 0.8963 - f1_m: 0.8949 - val_loss: 0.6021 - val_accuracy: 0.8160 - val_f1_m: 0.8205
Epoch 94/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0187 - accuracy: 0.8931 - f1_m: 0.8897 - val_loss: 0.6277 - val_accuracy: 0.8107 - val_f1_m: 0.8152
Epoch 94: early stopping
CPU times: total: 2min 1s
Wall time: 2min 26s
In [ ]:
evaluate_and_save_model(BaseModel_128_DA,  'BaseModel_128_DA', 64,save_models=False)
evaluate_and_save_model(BaseModel_31_DA, 'BaseModel_31_DA', 64,save_models=False)
Model Name            BaseModel_128_DA
Epochs                              55
Batch Size                          64
Train Loss                     0.00829
Val Loss                      0.602679
Train Acc                     0.957466
Val Acc                          0.842
[Train - Val] Acc             0.115466
[Train - Val] Loss           -0.594389
Name: BaseModel_128_DA, dtype: object
Model Name            BaseModel_31_DA
Epochs                             94
Batch Size                         64
Train Loss                   0.020766
Val Loss                     0.561303
Train Acc                    0.882366
Val Acc                      0.833667
[Train - Val] Acc            0.048699
[Train - Val] Loss          -0.540537
Name: BaseModel_31_DA, dtype: object
In [ ]:
DAbaseline_128_history = json.load(open('./models/BaseModel_128_DA_history.json', 'r'))
DAbaseline_31_history = json.load(open('./models/BaseModel_31_DA_history.json', 'r'))
In [ ]:
compare_curves(DAbaseline_31_history, DAbaseline_128_history, '31x31', '128x128')
No description has been provided for this image

Observations:

  • We can see that comparing to the model without data agumentation, the model perfoms worse. However looking at the accuracy and loss graphs, we can see that the model does not overfit as badly as the model trained without data augmentation.
  • We still see that the 128x128 model overfitts alot more and faster as compared to our 31x31 model

Training with Data Augmentation and Regularization¶

In [ ]:
def create_Basemodel_regularization(input_shape, learning_rate, momentum, class_weights_dict, dataset_train, dataset_test, steps_per_epoch, weight_decay):
    tf.keras.backend.clear_session()
    model = Sequential()
    model.add(tf.keras.layers.Rescaling(1./255, input_shape=input_shape))
    model.add(Conv2D(64, (3,3), activation='relu', kernel_regularizer=l2(weight_decay)))
    model.add(MaxPooling2D((2,2)))
    model.add(Conv2D(64, (3,3), activation='relu', kernel_regularizer=l2(weight_decay)))
    model.add(MaxPooling2D((2,2)))
    model.add(Flatten())
    model.add(Dense(128, activation='relu', kernel_regularizer=l2(weight_decay)))
    model.add(Dense(128, activation='relu', kernel_regularizer=l2(weight_decay)))
    model.add(Dense(15, activation='softmax'))
    model.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
    model.fit(dataset_train, epochs=150, validation_data=dataset_test, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
    return model
In [ ]:
%%time
BaseModel_31_DA_RE = create_Basemodel_regularization((31,31,1),learning_rate,momentum,class_weights_dict,dataset_train_31,dataset_test_31,steps_per_epoch,weight_decay)
Epoch 1/150
142/142 [==============================] - 2s 12ms/step - loss: 0.3631 - accuracy: 0.0463 - f1_m: 0.0000e+00 - val_loss: 2.9083 - val_accuracy: 0.0780 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 2s 11ms/step - loss: 0.3511 - accuracy: 0.0757 - f1_m: 0.0000e+00 - val_loss: 2.8917 - val_accuracy: 0.1077 - val_f1_m: 0.0000e+00
Epoch 3/150
142/142 [==============================] - 2s 11ms/step - loss: 0.3398 - accuracy: 0.0804 - f1_m: 0.0000e+00 - val_loss: 2.8754 - val_accuracy: 0.1243 - val_f1_m: 0.0000e+00
Epoch 4/150
142/142 [==============================] - 2s 12ms/step - loss: 0.3290 - accuracy: 0.1032 - f1_m: 0.0000e+00 - val_loss: 2.8571 - val_accuracy: 0.1327 - val_f1_m: 0.0000e+00
Epoch 5/150
142/142 [==============================] - 2s 11ms/step - loss: 0.3187 - accuracy: 0.1177 - f1_m: 0.0000e+00 - val_loss: 2.8357 - val_accuracy: 0.1410 - val_f1_m: 0.0000e+00
Epoch 6/150
142/142 [==============================] - 2s 11ms/step - loss: 0.3087 - accuracy: 0.1283 - f1_m: 0.0000e+00 - val_loss: 2.8080 - val_accuracy: 0.1430 - val_f1_m: 0.0000e+00
Epoch 7/150
142/142 [==============================] - 2s 10ms/step - loss: 0.2987 - accuracy: 0.1303 - f1_m: 0.0000e+00 - val_loss: 2.7681 - val_accuracy: 0.1467 - val_f1_m: 0.0000e+00
Epoch 8/150
142/142 [==============================] - 2s 10ms/step - loss: 0.2885 - accuracy: 0.1361 - f1_m: 0.0000e+00 - val_loss: 2.7059 - val_accuracy: 0.1697 - val_f1_m: 0.0000e+00
Epoch 9/150
142/142 [==============================] - 2s 11ms/step - loss: 0.2779 - accuracy: 0.1613 - f1_m: 0.0000e+00 - val_loss: 2.6281 - val_accuracy: 0.2170 - val_f1_m: 0.0000e+00
Epoch 10/150
142/142 [==============================] - 2s 11ms/step - loss: 0.2671 - accuracy: 0.1902 - f1_m: 0.0000e+00 - val_loss: 2.5486 - val_accuracy: 0.2327 - val_f1_m: 0.0000e+00
Epoch 11/150
142/142 [==============================] - 2s 11ms/step - loss: 0.2573 - accuracy: 0.2117 - f1_m: 0.0026 - val_loss: 2.4952 - val_accuracy: 0.2350 - val_f1_m: 0.0206
Epoch 12/150
142/142 [==============================] - 2s 10ms/step - loss: 0.2482 - accuracy: 0.2383 - f1_m: 0.0054 - val_loss: 2.4324 - val_accuracy: 0.2600 - val_f1_m: 0.0224
Epoch 13/150
142/142 [==============================] - 2s 10ms/step - loss: 0.2401 - accuracy: 0.2590 - f1_m: 0.0066 - val_loss: 2.3980 - val_accuracy: 0.2653 - val_f1_m: 0.0168
Epoch 14/150
142/142 [==============================] - 1s 10ms/step - loss: 0.2332 - accuracy: 0.2641 - f1_m: 0.0077 - val_loss: 2.3730 - val_accuracy: 0.2630 - val_f1_m: 0.0224
Epoch 15/150
142/142 [==============================] - 1s 10ms/step - loss: 0.2268 - accuracy: 0.2705 - f1_m: 0.0130 - val_loss: 2.3364 - val_accuracy: 0.2787 - val_f1_m: 0.0284
Epoch 16/150
142/142 [==============================] - 1s 10ms/step - loss: 0.2203 - accuracy: 0.2815 - f1_m: 0.0149 - val_loss: 2.3098 - val_accuracy: 0.2853 - val_f1_m: 0.0327
Epoch 17/150
142/142 [==============================] - 1s 10ms/step - loss: 0.2142 - accuracy: 0.2971 - f1_m: 0.0177 - val_loss: 2.2912 - val_accuracy: 0.2893 - val_f1_m: 0.0342
Epoch 18/150
142/142 [==============================] - 2s 10ms/step - loss: 0.2079 - accuracy: 0.3027 - f1_m: 0.0258 - val_loss: 2.2851 - val_accuracy: 0.2850 - val_f1_m: 0.0619
Epoch 19/150
142/142 [==============================] - 2s 11ms/step - loss: 0.2024 - accuracy: 0.3119 - f1_m: 0.0326 - val_loss: 2.2353 - val_accuracy: 0.3013 - val_f1_m: 0.0681
Epoch 20/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1973 - accuracy: 0.3168 - f1_m: 0.0376 - val_loss: 2.2071 - val_accuracy: 0.3270 - val_f1_m: 0.0696
Epoch 21/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1915 - accuracy: 0.3358 - f1_m: 0.0538 - val_loss: 2.1806 - val_accuracy: 0.3357 - val_f1_m: 0.0623
Epoch 22/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1866 - accuracy: 0.3436 - f1_m: 0.0626 - val_loss: 2.1678 - val_accuracy: 0.3227 - val_f1_m: 0.1013
Epoch 23/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1810 - accuracy: 0.3587 - f1_m: 0.0767 - val_loss: 2.0720 - val_accuracy: 0.3593 - val_f1_m: 0.0997
Epoch 24/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1760 - accuracy: 0.3705 - f1_m: 0.0911 - val_loss: 2.0400 - val_accuracy: 0.3730 - val_f1_m: 0.1397
Epoch 25/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1718 - accuracy: 0.3762 - f1_m: 0.1168 - val_loss: 1.9876 - val_accuracy: 0.3833 - val_f1_m: 0.1500
Epoch 26/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1667 - accuracy: 0.3879 - f1_m: 0.1382 - val_loss: 1.9518 - val_accuracy: 0.3987 - val_f1_m: 0.1742
Epoch 27/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1623 - accuracy: 0.4008 - f1_m: 0.1639 - val_loss: 2.0443 - val_accuracy: 0.3677 - val_f1_m: 0.2070
Epoch 28/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1595 - accuracy: 0.4005 - f1_m: 0.1713 - val_loss: 1.9390 - val_accuracy: 0.3930 - val_f1_m: 0.2318
Epoch 29/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1545 - accuracy: 0.4147 - f1_m: 0.1989 - val_loss: 1.8599 - val_accuracy: 0.4193 - val_f1_m: 0.2444
Epoch 30/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1498 - accuracy: 0.4318 - f1_m: 0.2260 - val_loss: 1.8589 - val_accuracy: 0.4167 - val_f1_m: 0.2263
Epoch 31/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1478 - accuracy: 0.4348 - f1_m: 0.2306 - val_loss: 1.7975 - val_accuracy: 0.4400 - val_f1_m: 0.2547
Epoch 32/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1433 - accuracy: 0.4516 - f1_m: 0.2588 - val_loss: 1.8770 - val_accuracy: 0.4137 - val_f1_m: 0.2437
Epoch 33/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1406 - accuracy: 0.4578 - f1_m: 0.2786 - val_loss: 1.7287 - val_accuracy: 0.4690 - val_f1_m: 0.3046
Epoch 34/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1370 - accuracy: 0.4724 - f1_m: 0.2961 - val_loss: 1.7169 - val_accuracy: 0.4763 - val_f1_m: 0.3192
Epoch 35/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1343 - accuracy: 0.4733 - f1_m: 0.3105 - val_loss: 1.6893 - val_accuracy: 0.4807 - val_f1_m: 0.3389
Epoch 36/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1313 - accuracy: 0.4907 - f1_m: 0.3353 - val_loss: 1.6938 - val_accuracy: 0.4773 - val_f1_m: 0.3333
Epoch 37/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1292 - accuracy: 0.4993 - f1_m: 0.3398 - val_loss: 1.7823 - val_accuracy: 0.4323 - val_f1_m: 0.3209
Epoch 38/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1264 - accuracy: 0.5071 - f1_m: 0.3607 - val_loss: 1.6024 - val_accuracy: 0.5040 - val_f1_m: 0.3869
Epoch 39/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1238 - accuracy: 0.5132 - f1_m: 0.3756 - val_loss: 1.5919 - val_accuracy: 0.5083 - val_f1_m: 0.3960
Epoch 40/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1213 - accuracy: 0.5247 - f1_m: 0.3954 - val_loss: 1.5924 - val_accuracy: 0.5150 - val_f1_m: 0.3898
Epoch 41/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1189 - accuracy: 0.5337 - f1_m: 0.4116 - val_loss: 1.5287 - val_accuracy: 0.5237 - val_f1_m: 0.4156
Epoch 42/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1169 - accuracy: 0.5436 - f1_m: 0.4216 - val_loss: 1.5916 - val_accuracy: 0.4950 - val_f1_m: 0.4051
Epoch 43/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1145 - accuracy: 0.5480 - f1_m: 0.4462 - val_loss: 1.4714 - val_accuracy: 0.5510 - val_f1_m: 0.4538
Epoch 44/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1126 - accuracy: 0.5554 - f1_m: 0.4515 - val_loss: 1.5734 - val_accuracy: 0.5070 - val_f1_m: 0.4305
Epoch 45/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1102 - accuracy: 0.5691 - f1_m: 0.4733 - val_loss: 1.5312 - val_accuracy: 0.5197 - val_f1_m: 0.4514
Epoch 46/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1088 - accuracy: 0.5714 - f1_m: 0.4812 - val_loss: 1.4789 - val_accuracy: 0.5487 - val_f1_m: 0.4600
Epoch 47/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1078 - accuracy: 0.5739 - f1_m: 0.4804 - val_loss: 1.4763 - val_accuracy: 0.5403 - val_f1_m: 0.4782
Epoch 48/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1060 - accuracy: 0.5836 - f1_m: 0.5020 - val_loss: 1.4026 - val_accuracy: 0.5653 - val_f1_m: 0.4994
Epoch 49/150
142/142 [==============================] - 2s 11ms/step - loss: 0.1031 - accuracy: 0.6057 - f1_m: 0.5149 - val_loss: 1.3638 - val_accuracy: 0.5930 - val_f1_m: 0.5194
Epoch 50/150
142/142 [==============================] - 2s 10ms/step - loss: 0.1025 - accuracy: 0.6043 - f1_m: 0.5231 - val_loss: 1.3934 - val_accuracy: 0.5793 - val_f1_m: 0.5009
Epoch 51/150
142/142 [==============================] - 1s 10ms/step - loss: 0.1002 - accuracy: 0.6180 - f1_m: 0.5410 - val_loss: 1.3724 - val_accuracy: 0.5777 - val_f1_m: 0.5206
Epoch 52/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0993 - accuracy: 0.6148 - f1_m: 0.5492 - val_loss: 1.3464 - val_accuracy: 0.6023 - val_f1_m: 0.5283
Epoch 53/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0967 - accuracy: 0.6342 - f1_m: 0.5616 - val_loss: 1.3317 - val_accuracy: 0.5977 - val_f1_m: 0.5360
Epoch 54/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0963 - accuracy: 0.6365 - f1_m: 0.5650 - val_loss: 1.2894 - val_accuracy: 0.6160 - val_f1_m: 0.5610
Epoch 55/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0952 - accuracy: 0.6388 - f1_m: 0.5726 - val_loss: 1.3018 - val_accuracy: 0.6227 - val_f1_m: 0.5632
Epoch 56/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0931 - accuracy: 0.6522 - f1_m: 0.5863 - val_loss: 1.2745 - val_accuracy: 0.6117 - val_f1_m: 0.5692
Epoch 57/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0917 - accuracy: 0.6596 - f1_m: 0.5968 - val_loss: 1.3920 - val_accuracy: 0.5713 - val_f1_m: 0.5252
Epoch 58/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0929 - accuracy: 0.6470 - f1_m: 0.5873 - val_loss: 1.2412 - val_accuracy: 0.6373 - val_f1_m: 0.5841
Epoch 59/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0898 - accuracy: 0.6678 - f1_m: 0.6135 - val_loss: 1.2483 - val_accuracy: 0.6330 - val_f1_m: 0.5793
Epoch 60/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0882 - accuracy: 0.6742 - f1_m: 0.6200 - val_loss: 1.2591 - val_accuracy: 0.6240 - val_f1_m: 0.5771
Epoch 61/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0886 - accuracy: 0.6707 - f1_m: 0.6254 - val_loss: 1.1887 - val_accuracy: 0.6603 - val_f1_m: 0.6070
Epoch 62/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0864 - accuracy: 0.6906 - f1_m: 0.6368 - val_loss: 1.3977 - val_accuracy: 0.5783 - val_f1_m: 0.5399
Epoch 63/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0898 - accuracy: 0.6717 - f1_m: 0.6160 - val_loss: 1.1795 - val_accuracy: 0.6580 - val_f1_m: 0.6181
Epoch 64/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0840 - accuracy: 0.7040 - f1_m: 0.6539 - val_loss: 1.2333 - val_accuracy: 0.6257 - val_f1_m: 0.5797
Epoch 65/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0836 - accuracy: 0.7029 - f1_m: 0.6610 - val_loss: 1.1573 - val_accuracy: 0.6627 - val_f1_m: 0.6321
Epoch 66/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0834 - accuracy: 0.7065 - f1_m: 0.6526 - val_loss: 1.2101 - val_accuracy: 0.6350 - val_f1_m: 0.5913
Epoch 67/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0830 - accuracy: 0.7065 - f1_m: 0.6658 - val_loss: 1.1503 - val_accuracy: 0.6600 - val_f1_m: 0.6347
Epoch 68/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0813 - accuracy: 0.7149 - f1_m: 0.6797 - val_loss: 1.1894 - val_accuracy: 0.6530 - val_f1_m: 0.6201
Epoch 69/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0805 - accuracy: 0.7200 - f1_m: 0.6885 - val_loss: 1.1504 - val_accuracy: 0.6687 - val_f1_m: 0.6345
Epoch 70/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0788 - accuracy: 0.7360 - f1_m: 0.6957 - val_loss: 1.1375 - val_accuracy: 0.6603 - val_f1_m: 0.6365
Epoch 71/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0780 - accuracy: 0.7395 - f1_m: 0.7069 - val_loss: 1.0894 - val_accuracy: 0.6800 - val_f1_m: 0.6583
Epoch 72/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0761 - accuracy: 0.7506 - f1_m: 0.7196 - val_loss: 1.1163 - val_accuracy: 0.6743 - val_f1_m: 0.6570
Epoch 73/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0760 - accuracy: 0.7498 - f1_m: 0.7213 - val_loss: 1.0657 - val_accuracy: 0.6920 - val_f1_m: 0.6751
Epoch 74/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0753 - accuracy: 0.7586 - f1_m: 0.7306 - val_loss: 1.0490 - val_accuracy: 0.6930 - val_f1_m: 0.6744
Epoch 75/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0741 - accuracy: 0.7686 - f1_m: 0.7332 - val_loss: 1.0088 - val_accuracy: 0.7083 - val_f1_m: 0.6943
Epoch 76/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0740 - accuracy: 0.7669 - f1_m: 0.7399 - val_loss: 1.0436 - val_accuracy: 0.7023 - val_f1_m: 0.6753
Epoch 77/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0730 - accuracy: 0.7723 - f1_m: 0.7461 - val_loss: 1.1590 - val_accuracy: 0.6533 - val_f1_m: 0.6428
Epoch 78/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0731 - accuracy: 0.7749 - f1_m: 0.7475 - val_loss: 1.0821 - val_accuracy: 0.6813 - val_f1_m: 0.6662
Epoch 79/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0714 - accuracy: 0.7838 - f1_m: 0.7597 - val_loss: 1.0907 - val_accuracy: 0.6713 - val_f1_m: 0.6523
Epoch 80/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0719 - accuracy: 0.7788 - f1_m: 0.7603 - val_loss: 0.9532 - val_accuracy: 0.7270 - val_f1_m: 0.7174
Epoch 81/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0702 - accuracy: 0.7889 - f1_m: 0.7696 - val_loss: 0.9981 - val_accuracy: 0.7073 - val_f1_m: 0.7034
Epoch 82/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0702 - accuracy: 0.7930 - f1_m: 0.7736 - val_loss: 1.0340 - val_accuracy: 0.6987 - val_f1_m: 0.6847
Epoch 83/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0689 - accuracy: 0.8004 - f1_m: 0.7788 - val_loss: 0.9359 - val_accuracy: 0.7287 - val_f1_m: 0.7183
Epoch 84/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0690 - accuracy: 0.7975 - f1_m: 0.7761 - val_loss: 0.9874 - val_accuracy: 0.7190 - val_f1_m: 0.7085
Epoch 85/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0690 - accuracy: 0.8000 - f1_m: 0.7755 - val_loss: 0.9288 - val_accuracy: 0.7350 - val_f1_m: 0.7313
Epoch 86/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0687 - accuracy: 0.8016 - f1_m: 0.7801 - val_loss: 0.9395 - val_accuracy: 0.7287 - val_f1_m: 0.7223
Epoch 87/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0674 - accuracy: 0.8113 - f1_m: 0.7916 - val_loss: 0.9339 - val_accuracy: 0.7387 - val_f1_m: 0.7196
Epoch 88/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0666 - accuracy: 0.8196 - f1_m: 0.7995 - val_loss: 0.9580 - val_accuracy: 0.7273 - val_f1_m: 0.7161
Epoch 89/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0660 - accuracy: 0.8200 - f1_m: 0.8004 - val_loss: 0.9419 - val_accuracy: 0.7297 - val_f1_m: 0.7233
Epoch 90/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0666 - accuracy: 0.8207 - f1_m: 0.8004 - val_loss: 1.1195 - val_accuracy: 0.6727 - val_f1_m: 0.6497
Epoch 91/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0676 - accuracy: 0.8115 - f1_m: 0.7989 - val_loss: 0.9161 - val_accuracy: 0.7433 - val_f1_m: 0.7373
Epoch 92/150
142/142 [==============================] - 2s 12ms/step - loss: 0.0645 - accuracy: 0.8295 - f1_m: 0.8163 - val_loss: 0.8970 - val_accuracy: 0.7330 - val_f1_m: 0.7324
Epoch 93/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0640 - accuracy: 0.8385 - f1_m: 0.8204 - val_loss: 0.8959 - val_accuracy: 0.7510 - val_f1_m: 0.7429
Epoch 94/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0636 - accuracy: 0.8398 - f1_m: 0.8244 - val_loss: 1.4933 - val_accuracy: 0.5550 - val_f1_m: 0.5495
Epoch 95/150
142/142 [==============================] - 2s 11ms/step - loss: 0.0676 - accuracy: 0.8119 - f1_m: 0.7941 - val_loss: 0.8672 - val_accuracy: 0.7533 - val_f1_m: 0.7456
Epoch 96/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0625 - accuracy: 0.8517 - f1_m: 0.8384 - val_loss: 0.9030 - val_accuracy: 0.7413 - val_f1_m: 0.7337
Epoch 97/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0620 - accuracy: 0.8525 - f1_m: 0.8403 - val_loss: 0.9809 - val_accuracy: 0.7127 - val_f1_m: 0.7087
Epoch 98/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0626 - accuracy: 0.8489 - f1_m: 0.8368 - val_loss: 0.8436 - val_accuracy: 0.7597 - val_f1_m: 0.7568
Epoch 99/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0608 - accuracy: 0.8603 - f1_m: 0.8472 - val_loss: 0.8854 - val_accuracy: 0.7603 - val_f1_m: 0.7487
Epoch 100/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0624 - accuracy: 0.8480 - f1_m: 0.8350 - val_loss: 0.8894 - val_accuracy: 0.7463 - val_f1_m: 0.7420
Epoch 101/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0604 - accuracy: 0.8618 - f1_m: 0.8499 - val_loss: 1.2201 - val_accuracy: 0.6547 - val_f1_m: 0.6414
Epoch 102/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0638 - accuracy: 0.8419 - f1_m: 0.8255 - val_loss: 0.8682 - val_accuracy: 0.7567 - val_f1_m: 0.7500
Epoch 103/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0600 - accuracy: 0.8694 - f1_m: 0.8594 - val_loss: 0.8565 - val_accuracy: 0.7617 - val_f1_m: 0.7553
Epoch 104/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0599 - accuracy: 0.8689 - f1_m: 0.8535 - val_loss: 0.9009 - val_accuracy: 0.7483 - val_f1_m: 0.7424
Epoch 105/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0599 - accuracy: 0.8652 - f1_m: 0.8571 - val_loss: 0.8841 - val_accuracy: 0.7440 - val_f1_m: 0.7414
Epoch 106/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0593 - accuracy: 0.8732 - f1_m: 0.8610 - val_loss: 0.8497 - val_accuracy: 0.7583 - val_f1_m: 0.7622
Epoch 107/150
142/142 [==============================] - 2s 10ms/step - loss: 0.0594 - accuracy: 0.8725 - f1_m: 0.8651 - val_loss: 0.8737 - val_accuracy: 0.7580 - val_f1_m: 0.7508
Epoch 108/150
142/142 [==============================] - 1s 10ms/step - loss: 0.0588 - accuracy: 0.8767 - f1_m: 0.8635 - val_loss: 0.8585 - val_accuracy: 0.7610 - val_f1_m: 0.7565
Epoch 108: early stopping
CPU times: total: 2min 23s
Wall time: 2min 51s
In [ ]:
%%time
BaseModel_128_DA_RE = create_Basemodel_regularization((128,128,1),learning_rate,momentum,class_weights_dict,dataset_train_128,dataset_test_128,steps_per_epoch,weight_decay)
Epoch 1/150
142/142 [==============================] - 6s 37ms/step - loss: 0.3695 - accuracy: 0.0944 - f1_m: 0.0000e+00 - val_loss: 2.8922 - val_accuracy: 0.1210 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 5s 36ms/step - loss: 0.3544 - accuracy: 0.1306 - f1_m: 0.0000e+00 - val_loss: 2.7994 - val_accuracy: 0.1320 - val_f1_m: 0.0000e+00
Epoch 3/150
142/142 [==============================] - 5s 36ms/step - loss: 0.3374 - accuracy: 0.1628 - f1_m: 0.0035 - val_loss: 2.7085 - val_accuracy: 0.1573 - val_f1_m: 0.0234
Epoch 4/150
142/142 [==============================] - 5s 35ms/step - loss: 0.3211 - accuracy: 0.2255 - f1_m: 0.0075 - val_loss: 2.5500 - val_accuracy: 0.2683 - val_f1_m: 0.0198
Epoch 5/150
142/142 [==============================] - 5s 36ms/step - loss: 0.3032 - accuracy: 0.2878 - f1_m: 0.0176 - val_loss: 2.3888 - val_accuracy: 0.2990 - val_f1_m: 0.0578
Epoch 6/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2867 - accuracy: 0.3373 - f1_m: 0.0576 - val_loss: 2.3293 - val_accuracy: 0.3120 - val_f1_m: 0.1389
Epoch 7/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2713 - accuracy: 0.3724 - f1_m: 0.1286 - val_loss: 2.1661 - val_accuracy: 0.3760 - val_f1_m: 0.1781
Epoch 8/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2567 - accuracy: 0.4086 - f1_m: 0.1972 - val_loss: 2.0725 - val_accuracy: 0.3960 - val_f1_m: 0.2583
Epoch 9/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2429 - accuracy: 0.4516 - f1_m: 0.2565 - val_loss: 1.9500 - val_accuracy: 0.4370 - val_f1_m: 0.2982
Epoch 10/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2291 - accuracy: 0.4867 - f1_m: 0.3316 - val_loss: 1.7864 - val_accuracy: 0.4903 - val_f1_m: 0.3737
Epoch 11/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2152 - accuracy: 0.5253 - f1_m: 0.4104 - val_loss: 1.7593 - val_accuracy: 0.4920 - val_f1_m: 0.4112
Epoch 12/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2015 - accuracy: 0.5677 - f1_m: 0.4828 - val_loss: 1.5988 - val_accuracy: 0.5387 - val_f1_m: 0.4747
Epoch 13/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1897 - accuracy: 0.6061 - f1_m: 0.5302 - val_loss: 1.3972 - val_accuracy: 0.5957 - val_f1_m: 0.5484
Epoch 14/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1796 - accuracy: 0.6321 - f1_m: 0.5791 - val_loss: 1.3273 - val_accuracy: 0.6260 - val_f1_m: 0.5818
Epoch 15/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1699 - accuracy: 0.6627 - f1_m: 0.6210 - val_loss: 1.5478 - val_accuracy: 0.5570 - val_f1_m: 0.5203
Epoch 16/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1580 - accuracy: 0.7029 - f1_m: 0.6690 - val_loss: 1.3066 - val_accuracy: 0.6140 - val_f1_m: 0.6110
Epoch 17/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1489 - accuracy: 0.7280 - f1_m: 0.7077 - val_loss: 1.1321 - val_accuracy: 0.6883 - val_f1_m: 0.6704
Epoch 18/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1394 - accuracy: 0.7622 - f1_m: 0.7404 - val_loss: 1.2173 - val_accuracy: 0.6617 - val_f1_m: 0.6509
Epoch 19/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1346 - accuracy: 0.7644 - f1_m: 0.7460 - val_loss: 1.1868 - val_accuracy: 0.6637 - val_f1_m: 0.6603
Epoch 20/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1268 - accuracy: 0.7950 - f1_m: 0.7813 - val_loss: 1.3124 - val_accuracy: 0.6393 - val_f1_m: 0.6312
Epoch 21/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1201 - accuracy: 0.8111 - f1_m: 0.8005 - val_loss: 1.1900 - val_accuracy: 0.6690 - val_f1_m: 0.6634
Epoch 22/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1160 - accuracy: 0.8178 - f1_m: 0.8117 - val_loss: 1.0923 - val_accuracy: 0.6967 - val_f1_m: 0.6993
Epoch 23/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1081 - accuracy: 0.8481 - f1_m: 0.8402 - val_loss: 1.0908 - val_accuracy: 0.7030 - val_f1_m: 0.7020
Epoch 24/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1032 - accuracy: 0.8658 - f1_m: 0.8537 - val_loss: 1.0913 - val_accuracy: 0.6980 - val_f1_m: 0.7040
Epoch 25/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1037 - accuracy: 0.8466 - f1_m: 0.8423 - val_loss: 1.0769 - val_accuracy: 0.7083 - val_f1_m: 0.7151
Epoch 26/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0934 - accuracy: 0.8917 - f1_m: 0.8883 - val_loss: 0.9446 - val_accuracy: 0.7447 - val_f1_m: 0.7541
Epoch 27/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0885 - accuracy: 0.9066 - f1_m: 0.9007 - val_loss: 1.1106 - val_accuracy: 0.7040 - val_f1_m: 0.7017
Epoch 28/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0878 - accuracy: 0.8932 - f1_m: 0.8898 - val_loss: 1.0574 - val_accuracy: 0.7183 - val_f1_m: 0.7220
Epoch 29/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0809 - accuracy: 0.9257 - f1_m: 0.9215 - val_loss: 0.9309 - val_accuracy: 0.7523 - val_f1_m: 0.7651
Epoch 30/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0780 - accuracy: 0.9289 - f1_m: 0.9257 - val_loss: 0.9241 - val_accuracy: 0.7663 - val_f1_m: 0.7698
Epoch 31/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0734 - accuracy: 0.9444 - f1_m: 0.9408 - val_loss: 1.1026 - val_accuracy: 0.7163 - val_f1_m: 0.7236
Epoch 32/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0727 - accuracy: 0.9385 - f1_m: 0.9363 - val_loss: 0.8984 - val_accuracy: 0.7760 - val_f1_m: 0.7771
Epoch 33/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0682 - accuracy: 0.9548 - f1_m: 0.9501 - val_loss: 0.8885 - val_accuracy: 0.7723 - val_f1_m: 0.7791
Epoch 34/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0665 - accuracy: 0.9539 - f1_m: 0.9488 - val_loss: 1.0299 - val_accuracy: 0.7443 - val_f1_m: 0.7476
Epoch 35/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0649 - accuracy: 0.9531 - f1_m: 0.9490 - val_loss: 0.8919 - val_accuracy: 0.7773 - val_f1_m: 0.7837
Epoch 36/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0607 - accuracy: 0.9715 - f1_m: 0.9669 - val_loss: 0.9326 - val_accuracy: 0.7610 - val_f1_m: 0.7675
Epoch 37/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0581 - accuracy: 0.9767 - f1_m: 0.9744 - val_loss: 0.9773 - val_accuracy: 0.7547 - val_f1_m: 0.7576
Epoch 38/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0574 - accuracy: 0.9661 - f1_m: 0.9664 - val_loss: 0.9749 - val_accuracy: 0.7503 - val_f1_m: 0.7514
Epoch 39/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0583 - accuracy: 0.9524 - f1_m: 0.9492 - val_loss: 0.9934 - val_accuracy: 0.7437 - val_f1_m: 0.7495
Epoch 40/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0544 - accuracy: 0.9723 - f1_m: 0.9710 - val_loss: 0.9045 - val_accuracy: 0.7730 - val_f1_m: 0.7781
Epoch 41/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0522 - accuracy: 0.9793 - f1_m: 0.9767 - val_loss: 0.9081 - val_accuracy: 0.7773 - val_f1_m: 0.7797
Epoch 42/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0504 - accuracy: 0.9802 - f1_m: 0.9771 - val_loss: 0.9759 - val_accuracy: 0.7557 - val_f1_m: 0.7639
Epoch 43/150
142/142 [==============================] - 5s 36ms/step - loss: 0.0485 - accuracy: 0.9846 - f1_m: 0.9827 - val_loss: 1.0259 - val_accuracy: 0.7433 - val_f1_m: 0.7465
Epoch 43: early stopping
CPU times: total: 2min 5s
Wall time: 3min 42s
In [ ]:
evaluate_and_save_model(BaseModel_128_DA_RE, 'BaseModel_128_DA_RE', 64,save_models=False)
evaluate_and_save_model(BaseModel_31_DA_RE, 'BaseModel_31_DA_RE', 64,save_models=False)
Model Name            BaseModel_128_DA_RE
Epochs                                 43
Batch Size                             64
Train Loss                       0.064911
Val Loss                         0.891881
Train Acc                        0.953146
Val Acc                          0.777333
[Train - Val] Acc                0.175812
[Train - Val] Loss              -0.826971
Name: BaseModel_128_DA_RE, dtype: object
Model Name            BaseModel_31_DA_RE
Epochs                               108
Batch Size                            64
Train Loss                      0.059987
Val Loss                        0.856455
Train Acc                       0.869406
Val Acc                         0.761667
[Train - Val] Acc                0.10774
[Train - Val] Loss             -0.796468
Name: BaseModel_31_DA_RE, dtype: object
In [ ]:
DAREbaseline_128_history = json.load(open('./models/BaseModel_128_DA_RE_history.json', 'r'))
DAREbaseline_31_history = json.load(open('./models/BaseModel_31_DA_RE_history.json', 'r'))
In [ ]:
compare_curves(DAREbaseline_31_history, DAREbaseline_128_history, '31x31', '128x128')
No description has been provided for this image

Observations:

  • We can see that with the inclusion of L2 Regularization, our models tend to not overfit as much as the previous models.
  • We can see that our 31x31 model has improved alot compared with training on only augmented images. However, our 128x128 model does not improve at all and even deproves compared with training on only augmented images.

How can we suit our models to the different sizes?¶

As mentioned early, bigger input sizes tend to overfit more and have longer training times due to the increased amount of trainable parameters. We also need deeper networks to allow our 128x128 model to better extract complex features.

  • We will be using the same stratagies to prevent overfitting in both 31x31 and 128x128 models
  • We will introduce more layers for our 128x128 model as compared to our 31x31 model.
  • We cant really do anything about the longer training time, unless we reduce our parameters compare to our 31x31 model, however that would defeat the purpose of making our 128x128 model deeper in the first place. :(

Custom CNN Network¶

We will be making a custom CNN model based on VGG-16 neural network while tweaking a few parameters. As our baseline model does not seem up to standard with its high overfitting rates even with early stopping.

Introduction to VGG-16:¶

VGG-16 is a convolutional neural network architecture proposed by the Visual Graphics Group (VGG) at the University of Oxford. It was introduced in the paper "Very Deep Convolutional Networks for Large-Scale Image Recognition" by Karen Simonyan and Andrew Zisserman in 2014 [3]. The VGG-16 architecture is known for its simplicity and uniform structure, consisting of 16 weight layers, including 13 convolutional layers and 3 fuly connected layers.

Why did i choose VGG-16?¶

VGG-16 gained popularity for its straightforward and regular design, featuring small 3x3 convolutional filters stacked on top of each other. This uniform architecture makes it easy to implement. Despite its simplicity, VGG-16 demonstrated impressive performance on various image recognition tasks.

Architecture of a regular VGG-16 network:¶

VGG-16 Architecture

Source

In the VGG-16 architecture, the network is organized into five blocks, each containing a certain number of convolutional layers followed by max-pooling layers. The fully connected layers at the end are responsible for making predictions. The use of small convolutional filters allows the network to learn complex features, and the pooling layers help reduce spatial dimensions.

Difference between VGG-16 and ResNet:¶

While VGG-16 and ResNet are both popular architectures, they differ in their approach to handling information flow. VGG-16 relies on stacking convolutional layers, while ResNet introduces skip connections to address the vanishing/exploding gradient problem. In ResNet, the skip connections allow the gradient to flow directly through the network, mitigating issues associated with deep architectures.

How are we going to build our custom model?¶

Here are some changes i made to our custom model

Reducing the amount of filters:

  • Decreases our computational load due to hardware limitations.
  • We will be adjusting the number of filters in convolutional layers, reducing the overall number of trainable parameters.

Batch Normalization:

  • Faster convergence and improved generalization.
  • We will be applying Batch normalizing to every ConvoBlock.

Our Network Depth for different image size:

  • We need to address overfitting for different input sizes (31x31 and 128x128) espically 128x128. As larger input sizes are more prone to overfitting.
  • Implementation:
    • For 31x31 input size: Implement a 9-layered VG16 variant.
    • For 128x128 input size: Use a 12-layered VG16 variant to handle larger input dimensions more effectively.

Including dropout layer:

  • Dropout randomly deactivates a portion of neurons during training, promoting the development of a more robust and generalized model. :)
  • We will be integrating dropout layers before the output layer.

L2 regularization:

  • Mitigate overfitting by penalizing large weights.
  • We will be applying L2 regularization to both Conv2D layers and Fully Connected (FC) layers within the network.

The traditional concern is that the noise introduced by dropout during training may interfere with the normalization process of batch normalization. Batch normalization smoothens the optimization landscape and accelerates training, while dropout adds regularization by preventing overfitting.

In [ ]:
def ConvoBlock(X, num_convs, num_filters):

    for _ in range(num_convs):
        X = Conv2D(num_filters, (3, 3), padding='same')(X)
        X = BatchNormalization()(X)
        X = Activation('relu')(X)

    X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(X)

    return X
In [ ]:
def create_Custom_model(input_shape, num_classes):
    tf.keras.backend.clear_session()
    if input_shape == (31,31,1):
        num_convs = [3,3,3]
        num_filters = [64,128,256]
    elif input_shape == (128,128,1):
        num_convs = [2,2,2,3,3]
        num_filters = [16,32,64,128,256]
    X_input = Input(input_shape)

    for i in range(len(num_convs)):
        if i == 0:
            X = ConvoBlock(X_input, num_convs[i], num_filters[i])
        else:
            X = ConvoBlock(X, num_convs[i], num_filters[i])

    X = Flatten()(X)

    # Add a dense layer for classification
    X = Dense(256, activation='relu',kernel_regularizer=l2(weight_decay))(X)
    X = Dense(256, activation='relu',kernel_regularizer=l2(weight_decay))(X)
    X = Dropout(0.1)(X)
    X = Dense(num_classes, activation='softmax')(X)

    # Create the model
    model = Model(inputs=X_input, outputs=X)

    return model

CustomModel_128 = create_Custom_model((128, 128, 1), 15)
CustomModel_31 = create_Custom_model((31, 31, 1), 15)

CustomModel_128.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
CustomModel_31.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
In [ ]:
CustomModel_128.summary()
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 128, 128, 1)]     0         
                                                                 
 conv2d (Conv2D)             (None, 128, 128, 16)      160       
                                                                 
 batch_normalization (BatchN  (None, 128, 128, 16)     64        
 ormalization)                                                   
                                                                 
 activation (Activation)     (None, 128, 128, 16)      0         
                                                                 
 conv2d_1 (Conv2D)           (None, 128, 128, 16)      2320      
                                                                 
 batch_normalization_1 (Batc  (None, 128, 128, 16)     64        
 hNormalization)                                                 
                                                                 
 activation_1 (Activation)   (None, 128, 128, 16)      0         
                                                                 
 max_pooling2d (MaxPooling2D  (None, 64, 64, 16)       0         
 )                                                               
                                                                 
 conv2d_2 (Conv2D)           (None, 64, 64, 32)        4640      
                                                                 
 batch_normalization_2 (Batc  (None, 64, 64, 32)       128       
 hNormalization)                                                 
                                                                 
 activation_2 (Activation)   (None, 64, 64, 32)        0         
                                                                 
 conv2d_3 (Conv2D)           (None, 64, 64, 32)        9248      
                                                                 
 batch_normalization_3 (Batc  (None, 64, 64, 32)       128       
 hNormalization)                                                 
                                                                 
 activation_3 (Activation)   (None, 64, 64, 32)        0         
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 32, 32, 32)       0         
 2D)                                                             
                                                                 
 conv2d_4 (Conv2D)           (None, 32, 32, 64)        18496     
                                                                 
 batch_normalization_4 (Batc  (None, 32, 32, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_4 (Activation)   (None, 32, 32, 64)        0         
                                                                 
 conv2d_5 (Conv2D)           (None, 32, 32, 64)        36928     
                                                                 
 batch_normalization_5 (Batc  (None, 32, 32, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_5 (Activation)   (None, 32, 32, 64)        0         
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 16, 16, 64)       0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 16, 16, 128)       73856     
                                                                 
 batch_normalization_6 (Batc  (None, 16, 16, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_6 (Activation)   (None, 16, 16, 128)       0         
                                                                 
 conv2d_7 (Conv2D)           (None, 16, 16, 128)       147584    
                                                                 
 batch_normalization_7 (Batc  (None, 16, 16, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_7 (Activation)   (None, 16, 16, 128)       0         
                                                                 
 conv2d_8 (Conv2D)           (None, 16, 16, 128)       147584    
                                                                 
 batch_normalization_8 (Batc  (None, 16, 16, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_8 (Activation)   (None, 16, 16, 128)       0         
                                                                 
 max_pooling2d_3 (MaxPooling  (None, 8, 8, 128)        0         
 2D)                                                             
                                                                 
 conv2d_9 (Conv2D)           (None, 8, 8, 256)         295168    
                                                                 
 batch_normalization_9 (Batc  (None, 8, 8, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_9 (Activation)   (None, 8, 8, 256)         0         
                                                                 
 conv2d_10 (Conv2D)          (None, 8, 8, 256)         590080    
                                                                 
 batch_normalization_10 (Bat  (None, 8, 8, 256)        1024      
 chNormalization)                                                
                                                                 
 activation_10 (Activation)  (None, 8, 8, 256)         0         
                                                                 
 conv2d_11 (Conv2D)          (None, 8, 8, 256)         590080    
                                                                 
 batch_normalization_11 (Bat  (None, 8, 8, 256)        1024      
 chNormalization)                                                
                                                                 
 activation_11 (Activation)  (None, 8, 8, 256)         0         
                                                                 
 max_pooling2d_4 (MaxPooling  (None, 4, 4, 256)        0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 4096)              0         
                                                                 
 dense (Dense)               (None, 256)               1048832   
                                                                 
 dense_1 (Dense)             (None, 256)               65792     
                                                                 
 dropout (Dropout)           (None, 256)               0         
                                                                 
 dense_2 (Dense)             (None, 15)                3855      
                                                                 
=================================================================
Total params: 3,040,127
Trainable params: 3,037,375
Non-trainable params: 2,752
_________________________________________________________________
In [ ]:
CustomModel_31.summary()
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 31, 31, 1)]       0         
                                                                 
 conv2d (Conv2D)             (None, 31, 31, 64)        640       
                                                                 
 batch_normalization (BatchN  (None, 31, 31, 64)       256       
 ormalization)                                                   
                                                                 
 activation (Activation)     (None, 31, 31, 64)        0         
                                                                 
 conv2d_1 (Conv2D)           (None, 31, 31, 64)        36928     
                                                                 
 batch_normalization_1 (Batc  (None, 31, 31, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_1 (Activation)   (None, 31, 31, 64)        0         
                                                                 
 conv2d_2 (Conv2D)           (None, 31, 31, 64)        36928     
                                                                 
 batch_normalization_2 (Batc  (None, 31, 31, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_2 (Activation)   (None, 31, 31, 64)        0         
                                                                 
 max_pooling2d (MaxPooling2D  (None, 15, 15, 64)       0         
 )                                                               
                                                                 
 conv2d_3 (Conv2D)           (None, 15, 15, 128)       73856     
                                                                 
 batch_normalization_3 (Batc  (None, 15, 15, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_3 (Activation)   (None, 15, 15, 128)       0         
                                                                 
 conv2d_4 (Conv2D)           (None, 15, 15, 128)       147584    
                                                                 
 batch_normalization_4 (Batc  (None, 15, 15, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_4 (Activation)   (None, 15, 15, 128)       0         
                                                                 
 conv2d_5 (Conv2D)           (None, 15, 15, 128)       147584    
                                                                 
 batch_normalization_5 (Batc  (None, 15, 15, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_5 (Activation)   (None, 15, 15, 128)       0         
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 7, 7, 128)        0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 7, 7, 256)         295168    
                                                                 
 batch_normalization_6 (Batc  (None, 7, 7, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_6 (Activation)   (None, 7, 7, 256)         0         
                                                                 
 conv2d_7 (Conv2D)           (None, 7, 7, 256)         590080    
                                                                 
 batch_normalization_7 (Batc  (None, 7, 7, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_7 (Activation)   (None, 7, 7, 256)         0         
                                                                 
 conv2d_8 (Conv2D)           (None, 7, 7, 256)         590080    
                                                                 
 batch_normalization_8 (Batc  (None, 7, 7, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_8 (Activation)   (None, 7, 7, 256)         0         
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 3, 3, 256)        0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 2304)              0         
                                                                 
 dense (Dense)               (None, 256)               590080    
                                                                 
 dense_1 (Dense)             (None, 256)               65792     
                                                                 
 dropout (Dropout)           (None, 256)               0         
                                                                 
 dense_2 (Dense)             (None, 15)                3855      
                                                                 
=================================================================
Total params: 2,583,951
Trainable params: 2,581,263
Non-trainable params: 2,688
_________________________________________________________________

Training without Data Augmentation¶

In [ ]:
%%time
CustomModel_128.fit(dataset_train_128, epochs=150, validation_data=dataset_test_128, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 10s 62ms/step - loss: 0.4669 - accuracy: 0.3795 - f1_m: 0.2279 - val_loss: 3.0552 - val_accuracy: 0.1193 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 8s 59ms/step - loss: 0.3966 - accuracy: 0.6915 - f1_m: 0.6550 - val_loss: 2.0017 - val_accuracy: 0.4380 - val_f1_m: 0.3427
Epoch 3/150
142/142 [==============================] - 8s 59ms/step - loss: 0.3518 - accuracy: 0.8412 - f1_m: 0.8301 - val_loss: 1.5338 - val_accuracy: 0.6123 - val_f1_m: 0.5956
Epoch 4/150
142/142 [==============================] - 8s 59ms/step - loss: 0.3306 - accuracy: 0.8636 - f1_m: 0.8607 - val_loss: 1.2626 - val_accuracy: 0.7280 - val_f1_m: 0.7283
Epoch 5/150
142/142 [==============================] - 8s 59ms/step - loss: 0.3033 - accuracy: 0.9289 - f1_m: 0.9253 - val_loss: 0.9722 - val_accuracy: 0.7707 - val_f1_m: 0.7762
Epoch 6/150
142/142 [==============================] - 8s 59ms/step - loss: 0.2824 - accuracy: 0.9613 - f1_m: 0.9593 - val_loss: 0.5643 - val_accuracy: 0.9050 - val_f1_m: 0.9072
Epoch 7/150
142/142 [==============================] - 8s 59ms/step - loss: 0.2655 - accuracy: 0.9743 - f1_m: 0.9741 - val_loss: 0.4851 - val_accuracy: 0.9273 - val_f1_m: 0.9290
Epoch 8/150
142/142 [==============================] - 8s 59ms/step - loss: 0.2496 - accuracy: 0.9857 - f1_m: 0.9800 - val_loss: 0.7654 - val_accuracy: 0.8257 - val_f1_m: 0.8269
Epoch 9/150
142/142 [==============================] - 8s 59ms/step - loss: 0.2410 - accuracy: 0.9602 - f1_m: 0.9589 - val_loss: 0.6492 - val_accuracy: 0.8690 - val_f1_m: 0.8744
Epoch 10/150
142/142 [==============================] - 8s 59ms/step - loss: 0.2239 - accuracy: 0.9855 - f1_m: 0.9849 - val_loss: 0.4848 - val_accuracy: 0.9220 - val_f1_m: 0.9243
Epoch 11/150
142/142 [==============================] - 8s 59ms/step - loss: 0.2101 - accuracy: 0.9962 - f1_m: 0.9929 - val_loss: 0.3863 - val_accuracy: 0.9477 - val_f1_m: 0.9478
Epoch 12/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1998 - accuracy: 0.9894 - f1_m: 0.9889 - val_loss: 0.3933 - val_accuracy: 0.9417 - val_f1_m: 0.9419
Epoch 13/150
142/142 [==============================] - 9s 59ms/step - loss: 0.1883 - accuracy: 0.9955 - f1_m: 0.9955 - val_loss: 0.3361 - val_accuracy: 0.9540 - val_f1_m: 0.9544
Epoch 14/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1776 - accuracy: 0.9979 - f1_m: 0.9978 - val_loss: 0.3102 - val_accuracy: 0.9610 - val_f1_m: 0.9620
Epoch 15/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1684 - accuracy: 0.9968 - f1_m: 0.9958 - val_loss: 0.2970 - val_accuracy: 0.9630 - val_f1_m: 0.9644
Epoch 16/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1593 - accuracy: 0.9971 - f1_m: 0.9942 - val_loss: 0.6286 - val_accuracy: 0.8467 - val_f1_m: 0.8490
Epoch 17/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1631 - accuracy: 0.9373 - f1_m: 0.9307 - val_loss: 0.5175 - val_accuracy: 0.8817 - val_f1_m: 0.8853
Epoch 18/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1473 - accuracy: 0.9771 - f1_m: 0.9752 - val_loss: 0.2817 - val_accuracy: 0.9577 - val_f1_m: 0.9583
Epoch 19/150
142/142 [==============================] - 9s 60ms/step - loss: 0.1360 - accuracy: 0.9969 - f1_m: 0.9969 - val_loss: 0.3471 - val_accuracy: 0.9307 - val_f1_m: 0.9295
Epoch 20/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1309 - accuracy: 0.9884 - f1_m: 0.9883 - val_loss: 0.2853 - val_accuracy: 0.9527 - val_f1_m: 0.9552
Epoch 21/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1216 - accuracy: 0.9981 - f1_m: 0.9981 - val_loss: 0.2560 - val_accuracy: 0.9610 - val_f1_m: 0.9619
Epoch 22/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1150 - accuracy: 0.9987 - f1_m: 0.9974 - val_loss: 0.2733 - val_accuracy: 0.9533 - val_f1_m: 0.9556
Epoch 23/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1096 - accuracy: 0.9951 - f1_m: 0.9939 - val_loss: 0.2129 - val_accuracy: 0.9687 - val_f1_m: 0.9700
Epoch 24/150
142/142 [==============================] - 8s 59ms/step - loss: 0.1032 - accuracy: 0.9990 - f1_m: 0.9960 - val_loss: 0.2399 - val_accuracy: 0.9597 - val_f1_m: 0.9589
Epoch 25/150
142/142 [==============================] - 9s 66ms/step - loss: 0.0982 - accuracy: 0.9960 - f1_m: 0.9949 - val_loss: 0.2139 - val_accuracy: 0.9650 - val_f1_m: 0.9657
Epoch 26/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0928 - accuracy: 0.9983 - f1_m: 0.9980 - val_loss: 0.2078 - val_accuracy: 0.9647 - val_f1_m: 0.9651
Epoch 27/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0877 - accuracy: 0.9991 - f1_m: 0.9989 - val_loss: 0.1876 - val_accuracy: 0.9687 - val_f1_m: 0.9703
Epoch 28/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0829 - accuracy: 0.9997 - f1_m: 0.9996 - val_loss: 0.1806 - val_accuracy: 0.9717 - val_f1_m: 0.9722
Epoch 29/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0787 - accuracy: 0.9990 - f1_m: 0.9970 - val_loss: 0.1878 - val_accuracy: 0.9693 - val_f1_m: 0.9698
Epoch 30/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0747 - accuracy: 0.9981 - f1_m: 0.9978 - val_loss: 0.1700 - val_accuracy: 0.9717 - val_f1_m: 0.9734
Epoch 31/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0706 - accuracy: 0.9998 - f1_m: 0.9997 - val_loss: 0.1645 - val_accuracy: 0.9737 - val_f1_m: 0.9743
Epoch 32/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0668 - accuracy: 0.9998 - f1_m: 0.9981 - val_loss: 0.2878 - val_accuracy: 0.9340 - val_f1_m: 0.9340
Epoch 33/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0676 - accuracy: 0.9816 - f1_m: 0.9809 - val_loss: 0.1885 - val_accuracy: 0.9643 - val_f1_m: 0.9644
Epoch 34/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0605 - accuracy: 0.9994 - f1_m: 0.9986 - val_loss: 0.1777 - val_accuracy: 0.9687 - val_f1_m: 0.9691
Epoch 35/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0577 - accuracy: 0.9983 - f1_m: 0.9978 - val_loss: 0.1959 - val_accuracy: 0.9617 - val_f1_m: 0.9626
Epoch 36/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0547 - accuracy: 0.9991 - f1_m: 0.9991 - val_loss: 0.1696 - val_accuracy: 0.9663 - val_f1_m: 0.9670
Epoch 37/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0516 - accuracy: 0.9998 - f1_m: 0.9986 - val_loss: 0.1672 - val_accuracy: 0.9687 - val_f1_m: 0.9691
Epoch 38/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0495 - accuracy: 0.9980 - f1_m: 0.9977 - val_loss: 0.1472 - val_accuracy: 0.9717 - val_f1_m: 0.9730
Epoch 39/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0467 - accuracy: 0.9994 - f1_m: 0.9972 - val_loss: 0.1489 - val_accuracy: 0.9713 - val_f1_m: 0.9721
Epoch 40/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0447 - accuracy: 0.9980 - f1_m: 0.9978 - val_loss: 0.1435 - val_accuracy: 0.9710 - val_f1_m: 0.9714
Epoch 41/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0422 - accuracy: 0.9992 - f1_m: 0.9991 - val_loss: 0.1385 - val_accuracy: 0.9700 - val_f1_m: 0.9729
Epoch 42/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0399 - accuracy: 1.0000 - f1_m: 0.9999 - val_loss: 0.1366 - val_accuracy: 0.9710 - val_f1_m: 0.9725
Epoch 43/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0380 - accuracy: 0.9997 - f1_m: 0.9947 - val_loss: 0.7156 - val_accuracy: 0.8090 - val_f1_m: 0.8146
Epoch 44/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0476 - accuracy: 0.9575 - f1_m: 0.9561 - val_loss: 0.2557 - val_accuracy: 0.9373 - val_f1_m: 0.9338
Epoch 45/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0355 - accuracy: 0.9983 - f1_m: 0.9981 - val_loss: 0.1423 - val_accuracy: 0.9697 - val_f1_m: 0.9688
Epoch 46/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0334 - accuracy: 0.9987 - f1_m: 0.9986 - val_loss: 0.1372 - val_accuracy: 0.9697 - val_f1_m: 0.9709
Epoch 47/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0322 - accuracy: 0.9970 - f1_m: 0.9969 - val_loss: 0.1377 - val_accuracy: 0.9697 - val_f1_m: 0.9694
Epoch 48/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0301 - accuracy: 0.9996 - f1_m: 0.9993 - val_loss: 0.1282 - val_accuracy: 0.9740 - val_f1_m: 0.9729
Epoch 49/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0288 - accuracy: 0.9990 - f1_m: 0.9986 - val_loss: 0.1414 - val_accuracy: 0.9640 - val_f1_m: 0.9651
Epoch 50/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0275 - accuracy: 0.9986 - f1_m: 0.9986 - val_loss: 0.1217 - val_accuracy: 0.9737 - val_f1_m: 0.9736
Epoch 51/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0260 - accuracy: 0.9997 - f1_m: 0.9979 - val_loss: 0.1963 - val_accuracy: 0.9473 - val_f1_m: 0.9490
Epoch 52/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0297 - accuracy: 0.9775 - f1_m: 0.9786 - val_loss: 0.1271 - val_accuracy: 0.9723 - val_f1_m: 0.9713
Epoch 53/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0239 - accuracy: 0.9994 - f1_m: 0.9993 - val_loss: 0.1167 - val_accuracy: 0.9740 - val_f1_m: 0.9743
Epoch 54/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0228 - accuracy: 0.9991 - f1_m: 0.9992 - val_loss: 0.1115 - val_accuracy: 0.9747 - val_f1_m: 0.9750
Epoch 55/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0215 - accuracy: 0.9998 - f1_m: 0.9988 - val_loss: 0.1167 - val_accuracy: 0.9717 - val_f1_m: 0.9731
Epoch 56/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0209 - accuracy: 0.9991 - f1_m: 0.9990 - val_loss: 0.1020 - val_accuracy: 0.9773 - val_f1_m: 0.9775
Epoch 57/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0197 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1050 - val_accuracy: 0.9777 - val_f1_m: 0.9785
Epoch 58/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0187 - accuracy: 1.0000 - f1_m: 0.9999 - val_loss: 0.0965 - val_accuracy: 0.9790 - val_f1_m: 0.9799
Epoch 59/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0179 - accuracy: 0.9997 - f1_m: 0.9981 - val_loss: 0.1027 - val_accuracy: 0.9780 - val_f1_m: 0.9763
Epoch 60/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0177 - accuracy: 0.9979 - f1_m: 0.9969 - val_loss: 0.1345 - val_accuracy: 0.9650 - val_f1_m: 0.9656
Epoch 61/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0166 - accuracy: 0.9990 - f1_m: 0.9992 - val_loss: 0.0969 - val_accuracy: 0.9780 - val_f1_m: 0.9790
Epoch 62/150
142/142 [==============================] - 8s 58ms/step - loss: 0.0159 - accuracy: 0.9994 - f1_m: 0.9978 - val_loss: 0.4235 - val_accuracy: 0.8777 - val_f1_m: 0.8775
Epoch 63/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0244 - accuracy: 0.9744 - f1_m: 0.9694 - val_loss: 0.1809 - val_accuracy: 0.9510 - val_f1_m: 0.9535
Epoch 64/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0163 - accuracy: 0.9944 - f1_m: 0.9943 - val_loss: 0.1207 - val_accuracy: 0.9737 - val_f1_m: 0.9725
Epoch 65/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0145 - accuracy: 0.9992 - f1_m: 0.9983 - val_loss: 0.1060 - val_accuracy: 0.9743 - val_f1_m: 0.9746
Epoch 66/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0143 - accuracy: 0.9971 - f1_m: 0.9963 - val_loss: 0.1128 - val_accuracy: 0.9707 - val_f1_m: 0.9699
Epoch 67/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0139 - accuracy: 0.9971 - f1_m: 0.9972 - val_loss: 0.0992 - val_accuracy: 0.9740 - val_f1_m: 0.9747
Epoch 68/150
142/142 [==============================] - 8s 59ms/step - loss: 0.0126 - accuracy: 0.9997 - f1_m: 0.9968 - val_loss: 0.1447 - val_accuracy: 0.9603 - val_f1_m: 0.9616
Epoch 68: early stopping
CPU times: total: 4min 22s
Wall time: 9min 37s
Out[ ]:
<keras.callbacks.History at 0x1de2eab9670>
In [ ]:
%%time
CustomModel_31.fit(dataset_train_31, epochs=150, validation_data=dataset_test_31, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 5s 25ms/step - loss: 0.4586 - accuracy: 0.3817 - f1_m: 0.2173 - val_loss: 2.7801 - val_accuracy: 0.1723 - val_f1_m: 6.5466e-04
Epoch 2/150
142/142 [==============================] - 3s 24ms/step - loss: 0.3886 - accuracy: 0.6776 - f1_m: 0.6218 - val_loss: 1.4081 - val_accuracy: 0.6863 - val_f1_m: 0.5629
Epoch 3/150
142/142 [==============================] - 3s 24ms/step - loss: 0.3471 - accuracy: 0.8173 - f1_m: 0.8037 - val_loss: 1.7350 - val_accuracy: 0.5420 - val_f1_m: 0.5242
Epoch 4/150
142/142 [==============================] - 3s 24ms/step - loss: 0.3170 - accuracy: 0.8979 - f1_m: 0.8932 - val_loss: 1.1168 - val_accuracy: 0.7330 - val_f1_m: 0.7269
Epoch 5/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2973 - accuracy: 0.9195 - f1_m: 0.9149 - val_loss: 0.7898 - val_accuracy: 0.8397 - val_f1_m: 0.8405
Epoch 6/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2752 - accuracy: 0.9662 - f1_m: 0.9643 - val_loss: 0.7310 - val_accuracy: 0.8570 - val_f1_m: 0.8580
Epoch 7/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2584 - accuracy: 0.9826 - f1_m: 0.9795 - val_loss: 0.6288 - val_accuracy: 0.8923 - val_f1_m: 0.8927
Epoch 8/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2434 - accuracy: 0.9900 - f1_m: 0.9887 - val_loss: 1.1280 - val_accuracy: 0.7337 - val_f1_m: 0.7297
Epoch 9/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2316 - accuracy: 0.9850 - f1_m: 0.9829 - val_loss: 0.5520 - val_accuracy: 0.8997 - val_f1_m: 0.8979
Epoch 10/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2175 - accuracy: 0.9940 - f1_m: 0.9933 - val_loss: 0.5454 - val_accuracy: 0.8983 - val_f1_m: 0.9011
Epoch 11/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2050 - accuracy: 0.9977 - f1_m: 0.9975 - val_loss: 0.5860 - val_accuracy: 0.8773 - val_f1_m: 0.8781
Epoch 12/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1936 - accuracy: 0.9992 - f1_m: 0.9946 - val_loss: 0.7436 - val_accuracy: 0.8263 - val_f1_m: 0.8287
Epoch 13/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1871 - accuracy: 0.9764 - f1_m: 0.9750 - val_loss: 0.5195 - val_accuracy: 0.8900 - val_f1_m: 0.8912
Epoch 14/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1741 - accuracy: 0.9979 - f1_m: 0.9930 - val_loss: 0.7036 - val_accuracy: 0.8413 - val_f1_m: 0.8470
Epoch 15/150
142/142 [==============================] - 3s 23ms/step - loss: 0.1699 - accuracy: 0.9767 - f1_m: 0.9728 - val_loss: 0.7253 - val_accuracy: 0.8210 - val_f1_m: 0.8209
Epoch 16/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1597 - accuracy: 0.9785 - f1_m: 0.9782 - val_loss: 0.5455 - val_accuracy: 0.8817 - val_f1_m: 0.8815
Epoch 17/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1478 - accuracy: 0.9992 - f1_m: 0.9981 - val_loss: 0.4442 - val_accuracy: 0.9120 - val_f1_m: 0.9135
Epoch 18/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1404 - accuracy: 0.9966 - f1_m: 0.9951 - val_loss: 0.4370 - val_accuracy: 0.9103 - val_f1_m: 0.9088
Epoch 19/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1331 - accuracy: 0.9960 - f1_m: 0.9956 - val_loss: 0.3994 - val_accuracy: 0.9227 - val_f1_m: 0.9248
Epoch 20/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1259 - accuracy: 0.9982 - f1_m: 0.9978 - val_loss: 0.3806 - val_accuracy: 0.9247 - val_f1_m: 0.9299
Epoch 21/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1186 - accuracy: 0.9997 - f1_m: 0.9997 - val_loss: 0.3743 - val_accuracy: 0.9233 - val_f1_m: 0.9254
Epoch 22/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1124 - accuracy: 0.9990 - f1_m: 0.9990 - val_loss: 0.3743 - val_accuracy: 0.9237 - val_f1_m: 0.9249
Epoch 23/150
142/142 [==============================] - 3s 23ms/step - loss: 0.1066 - accuracy: 0.9984 - f1_m: 0.9919 - val_loss: 0.6022 - val_accuracy: 0.8473 - val_f1_m: 0.8484
Epoch 24/150
142/142 [==============================] - 3s 23ms/step - loss: 0.1040 - accuracy: 0.9832 - f1_m: 0.9811 - val_loss: 0.4843 - val_accuracy: 0.8833 - val_f1_m: 0.8854
Epoch 25/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0985 - accuracy: 0.9894 - f1_m: 0.9896 - val_loss: 0.3382 - val_accuracy: 0.9270 - val_f1_m: 0.9302
Epoch 26/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0914 - accuracy: 0.9981 - f1_m: 0.9964 - val_loss: 0.3607 - val_accuracy: 0.9237 - val_f1_m: 0.9233
Epoch 27/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0865 - accuracy: 0.9979 - f1_m: 0.9979 - val_loss: 0.3383 - val_accuracy: 0.9280 - val_f1_m: 0.9290
Epoch 28/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0816 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.3276 - val_accuracy: 0.9273 - val_f1_m: 0.9292
Epoch 29/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0774 - accuracy: 0.9999 - f1_m: 0.9982 - val_loss: 0.3443 - val_accuracy: 0.9233 - val_f1_m: 0.9260
Epoch 30/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0742 - accuracy: 0.9973 - f1_m: 0.9971 - val_loss: 0.3122 - val_accuracy: 0.9320 - val_f1_m: 0.9314
Epoch 31/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0696 - accuracy: 0.9999 - f1_m: 0.9982 - val_loss: 0.3114 - val_accuracy: 0.9323 - val_f1_m: 0.9355
Epoch 32/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0684 - accuracy: 0.9915 - f1_m: 0.9881 - val_loss: 0.3542 - val_accuracy: 0.9127 - val_f1_m: 0.9141
Epoch 33/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0642 - accuracy: 0.9944 - f1_m: 0.9943 - val_loss: 0.2957 - val_accuracy: 0.9300 - val_f1_m: 0.9327
Epoch 34/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0597 - accuracy: 0.9999 - f1_m: 0.9982 - val_loss: 0.4158 - val_accuracy: 0.8953 - val_f1_m: 0.8955
Epoch 35/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0575 - accuracy: 0.9967 - f1_m: 0.9940 - val_loss: 0.3334 - val_accuracy: 0.9153 - val_f1_m: 0.9181
Epoch 36/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0567 - accuracy: 0.9899 - f1_m: 0.9893 - val_loss: 0.3118 - val_accuracy: 0.9210 - val_f1_m: 0.9248
Epoch 37/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0515 - accuracy: 0.9989 - f1_m: 0.9990 - val_loss: 0.2953 - val_accuracy: 0.9293 - val_f1_m: 0.9310
Epoch 38/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0486 - accuracy: 0.9999 - f1_m: 0.9998 - val_loss: 0.2776 - val_accuracy: 0.9313 - val_f1_m: 0.9342
Epoch 39/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0461 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.2694 - val_accuracy: 0.9360 - val_f1_m: 0.9367
Epoch 40/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0439 - accuracy: 0.9998 - f1_m: 0.9977 - val_loss: 0.3048 - val_accuracy: 0.9213 - val_f1_m: 0.9215
Epoch 41/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0437 - accuracy: 0.9927 - f1_m: 0.9894 - val_loss: 0.3970 - val_accuracy: 0.8950 - val_f1_m: 0.8937
Epoch 42/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0417 - accuracy: 0.9942 - f1_m: 0.9943 - val_loss: 0.2669 - val_accuracy: 0.9387 - val_f1_m: 0.9368
Epoch 43/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0381 - accuracy: 0.9999 - f1_m: 0.9990 - val_loss: 0.2706 - val_accuracy: 0.9337 - val_f1_m: 0.9363
Epoch 44/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0363 - accuracy: 0.9991 - f1_m: 0.9991 - val_loss: 0.2544 - val_accuracy: 0.9407 - val_f1_m: 0.9397
Epoch 45/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0344 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.2587 - val_accuracy: 0.9330 - val_f1_m: 0.9341
Epoch 46/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0329 - accuracy: 0.9997 - f1_m: 0.9986 - val_loss: 0.2786 - val_accuracy: 0.9300 - val_f1_m: 0.9327
Epoch 47/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0327 - accuracy: 0.9947 - f1_m: 0.9942 - val_loss: 0.2613 - val_accuracy: 0.9357 - val_f1_m: 0.9349
Epoch 48/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0299 - accuracy: 0.9998 - f1_m: 0.9998 - val_loss: 0.2326 - val_accuracy: 0.9433 - val_f1_m: 0.9450
Epoch 49/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0285 - accuracy: 0.9999 - f1_m: 0.9998 - val_loss: 0.2394 - val_accuracy: 0.9410 - val_f1_m: 0.9417
Epoch 50/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0271 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.2336 - val_accuracy: 0.9430 - val_f1_m: 0.9446
Epoch 51/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0262 - accuracy: 0.9986 - f1_m: 0.9963 - val_loss: 0.2763 - val_accuracy: 0.9273 - val_f1_m: 0.9255
Epoch 52/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0257 - accuracy: 0.9955 - f1_m: 0.9954 - val_loss: 0.2360 - val_accuracy: 0.9410 - val_f1_m: 0.9404
Epoch 53/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0238 - accuracy: 0.9993 - f1_m: 0.9993 - val_loss: 0.2284 - val_accuracy: 0.9413 - val_f1_m: 0.9422
Epoch 54/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0226 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.2246 - val_accuracy: 0.9427 - val_f1_m: 0.9437
Epoch 55/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0216 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.2219 - val_accuracy: 0.9423 - val_f1_m: 0.9439
Epoch 56/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0206 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.2247 - val_accuracy: 0.9403 - val_f1_m: 0.9413
Epoch 57/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0197 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.2410 - val_accuracy: 0.9367 - val_f1_m: 0.9372
Epoch 58/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0195 - accuracy: 0.9981 - f1_m: 0.9980 - val_loss: 0.2277 - val_accuracy: 0.9360 - val_f1_m: 0.9402
Epoch 59/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0182 - accuracy: 0.9998 - f1_m: 0.9989 - val_loss: 0.4779 - val_accuracy: 0.8540 - val_f1_m: 0.8541
Epoch 60/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0232 - accuracy: 0.9816 - f1_m: 0.9804 - val_loss: 0.2474 - val_accuracy: 0.9333 - val_f1_m: 0.9325
Epoch 61/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0171 - accuracy: 0.9998 - f1_m: 0.9997 - val_loss: 0.2183 - val_accuracy: 0.9427 - val_f1_m: 0.9441
Epoch 62/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0165 - accuracy: 0.9990 - f1_m: 0.9974 - val_loss: 0.2336 - val_accuracy: 0.9387 - val_f1_m: 0.9403
Epoch 63/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0166 - accuracy: 0.9956 - f1_m: 0.9954 - val_loss: 0.2129 - val_accuracy: 0.9447 - val_f1_m: 0.9440
Epoch 64/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0150 - accuracy: 1.0000 - f1_m: 0.9990 - val_loss: 0.2217 - val_accuracy: 0.9397 - val_f1_m: 0.9407
Epoch 65/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0150 - accuracy: 0.9984 - f1_m: 0.9980 - val_loss: 0.2110 - val_accuracy: 0.9440 - val_f1_m: 0.9466
Epoch 66/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0138 - accuracy: 1.0000 - f1_m: 0.9990 - val_loss: 0.2460 - val_accuracy: 0.9360 - val_f1_m: 0.9359
Epoch 67/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0145 - accuracy: 0.9950 - f1_m: 0.9928 - val_loss: 0.2473 - val_accuracy: 0.9343 - val_f1_m: 0.9350
Epoch 68/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0139 - accuracy: 0.9949 - f1_m: 0.9950 - val_loss: 0.2025 - val_accuracy: 0.9463 - val_f1_m: 0.9457
Epoch 69/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0124 - accuracy: 1.0000 - f1_m: 0.9990 - val_loss: 0.2485 - val_accuracy: 0.9287 - val_f1_m: 0.9297
Epoch 70/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0126 - accuracy: 0.9963 - f1_m: 0.9965 - val_loss: 0.2211 - val_accuracy: 0.9413 - val_f1_m: 0.9422
Epoch 71/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0119 - accuracy: 0.9988 - f1_m: 0.9972 - val_loss: 0.2137 - val_accuracy: 0.9427 - val_f1_m: 0.9437
Epoch 72/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0125 - accuracy: 0.9934 - f1_m: 0.9918 - val_loss: 0.2884 - val_accuracy: 0.9150 - val_f1_m: 0.9172
Epoch 73/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0131 - accuracy: 0.9911 - f1_m: 0.9906 - val_loss: 0.2271 - val_accuracy: 0.9407 - val_f1_m: 0.9413
Epoch 74/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0106 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1970 - val_accuracy: 0.9453 - val_f1_m: 0.9475
Epoch 75/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0102 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.2141 - val_accuracy: 0.9417 - val_f1_m: 0.9409
Epoch 76/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0101 - accuracy: 0.9990 - f1_m: 0.9979 - val_loss: 0.2303 - val_accuracy: 0.9347 - val_f1_m: 0.9354
Epoch 77/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0105 - accuracy: 0.9978 - f1_m: 0.9970 - val_loss: 0.1946 - val_accuracy: 0.9477 - val_f1_m: 0.9475
Epoch 78/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0094 - accuracy: 0.9997 - f1_m: 0.9997 - val_loss: 0.2115 - val_accuracy: 0.9420 - val_f1_m: 0.9399
Epoch 79/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0091 - accuracy: 0.9998 - f1_m: 0.9981 - val_loss: 0.3952 - val_accuracy: 0.8877 - val_f1_m: 0.8911
Epoch 80/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0140 - accuracy: 0.9783 - f1_m: 0.9776 - val_loss: 0.2344 - val_accuracy: 0.9347 - val_f1_m: 0.9363
Epoch 81/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0089 - accuracy: 0.9993 - f1_m: 0.9993 - val_loss: 0.1938 - val_accuracy: 0.9490 - val_f1_m: 0.9508
Epoch 82/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0085 - accuracy: 0.9998 - f1_m: 0.9988 - val_loss: 0.2001 - val_accuracy: 0.9457 - val_f1_m: 0.9471
Epoch 83/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0086 - accuracy: 0.9984 - f1_m: 0.9981 - val_loss: 0.1901 - val_accuracy: 0.9483 - val_f1_m: 0.9495
Epoch 84/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0078 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1847 - val_accuracy: 0.9520 - val_f1_m: 0.9526
Epoch 85/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0076 - accuracy: 0.9998 - f1_m: 0.9998 - val_loss: 0.1855 - val_accuracy: 0.9503 - val_f1_m: 0.9517
Epoch 86/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0074 - accuracy: 0.9997 - f1_m: 0.9953 - val_loss: 0.3298 - val_accuracy: 0.9043 - val_f1_m: 0.9091
Epoch 87/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0091 - accuracy: 0.9921 - f1_m: 0.9897 - val_loss: 0.2782 - val_accuracy: 0.9193 - val_f1_m: 0.9195
Epoch 88/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0079 - accuracy: 0.9968 - f1_m: 0.9957 - val_loss: 0.2101 - val_accuracy: 0.9417 - val_f1_m: 0.9400
Epoch 89/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0073 - accuracy: 0.9987 - f1_m: 0.9986 - val_loss: 0.1921 - val_accuracy: 0.9483 - val_f1_m: 0.9476
Epoch 90/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0067 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1817 - val_accuracy: 0.9520 - val_f1_m: 0.9516
Epoch 91/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0065 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1799 - val_accuracy: 0.9503 - val_f1_m: 0.9510
Epoch 92/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0064 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1837 - val_accuracy: 0.9510 - val_f1_m: 0.9520
Epoch 93/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0062 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1857 - val_accuracy: 0.9470 - val_f1_m: 0.9475
Epoch 94/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0060 - accuracy: 1.0000 - f1_m: 0.9989 - val_loss: 0.2169 - val_accuracy: 0.9407 - val_f1_m: 0.9416
Epoch 95/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0069 - accuracy: 0.9966 - f1_m: 0.9965 - val_loss: 0.1867 - val_accuracy: 0.9473 - val_f1_m: 0.9502
Epoch 96/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0058 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1780 - val_accuracy: 0.9490 - val_f1_m: 0.9519
Epoch 97/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0057 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1736 - val_accuracy: 0.9513 - val_f1_m: 0.9549
Epoch 98/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0055 - accuracy: 0.9999 - f1_m: 0.9970 - val_loss: 0.1917 - val_accuracy: 0.9447 - val_f1_m: 0.9462
Epoch 99/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0063 - accuracy: 0.9972 - f1_m: 0.9971 - val_loss: 0.1884 - val_accuracy: 0.9457 - val_f1_m: 0.9503
Epoch 100/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0054 - accuracy: 1.0000 - f1_m: 0.9999 - val_loss: 0.1798 - val_accuracy: 0.9497 - val_f1_m: 0.9506
Epoch 101/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0052 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1764 - val_accuracy: 0.9493 - val_f1_m: 0.9531
Epoch 102/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0051 - accuracy: 1.0000 - f1_m: 1.0000 - val_loss: 0.1775 - val_accuracy: 0.9490 - val_f1_m: 0.9531
Epoch 103/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0050 - accuracy: 0.9999 - f1_m: 0.9970 - val_loss: 0.2009 - val_accuracy: 0.9430 - val_f1_m: 0.9470
Epoch 104/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0058 - accuracy: 0.9962 - f1_m: 0.9947 - val_loss: 0.2004 - val_accuracy: 0.9397 - val_f1_m: 0.9399
Epoch 105/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0058 - accuracy: 0.9958 - f1_m: 0.9949 - val_loss: 0.2038 - val_accuracy: 0.9430 - val_f1_m: 0.9430
Epoch 106/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0052 - accuracy: 0.9990 - f1_m: 0.9988 - val_loss: 0.1835 - val_accuracy: 0.9473 - val_f1_m: 0.9488
Epoch 107/150
142/142 [==============================] - 3s 23ms/step - loss: 0.0048 - accuracy: 0.9999 - f1_m: 0.9999 - val_loss: 0.1764 - val_accuracy: 0.9493 - val_f1_m: 0.9526
Epoch 107: early stopping
CPU times: total: 2min 22s
Wall time: 6min 2s
Out[ ]:
<keras.callbacks.History at 0x1de2ee368b0>
In [ ]:
evaluate_and_save_model(CustomModel_128, 'CustomModel_128', 64,save_models=False)
evaluate_and_save_model(CustomModel_31, 'CustomModel_31', 64,save_models=False)
Model Name            CustomModel_128
Epochs                             68
Batch Size                         64
Train Loss                   0.018694
Val Loss                     0.096466
Train Acc                         1.0
Val Acc                         0.979
[Train - Val] Acc               0.021
[Train - Val] Loss          -0.077772
Name: CustomModel_128, dtype: object
Model Name            CustomModel_31
Epochs                           107
Batch Size                        64
Train Loss                  0.007828
Val Loss                    0.184748
Train Acc                        1.0
Val Acc                        0.952
[Train - Val] Acc              0.048
[Train - Val] Loss          -0.17692
Name: CustomModel_31, dtype: object
In [ ]:
customModel_history_128 = json.load(open('./models/CustomModel_128_history.json', 'r'))
customModel_history_31 = json.load(open('./models/CustomModel_31_history.json', 'r'))
compare_curves(customModel_history_31, customModel_history_128, '31x31', '128x128')
No description has been provided for this image

Observations:

  • We can see that our efforts to prevent overfitting has paid off, with our models having a much better time generalising to our data.
  • The presence of fluctuations in the accuracy and loss metrics could be attributed to the use of dropout layers. As dropout layers randomly drops a fraction of neurons during training.This introduces variability during our training,

Training with Data Augmentation¶

In [ ]:
%%time
CustomModel_128_DA = create_Custom_model((128, 128, 1), 15)
CustomModel_128_DA.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
CustomModel_128_DA.fit(train_generator_128, epochs=150, validation_data=dataset_test_128, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 10s 61ms/step - loss: 0.4727 - accuracy: 0.3467 - f1_m: 0.1923 - val_loss: 3.2902 - val_accuracy: 0.0703 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 8s 58ms/step - loss: 0.4027 - accuracy: 0.6447 - f1_m: 0.5972 - val_loss: 1.7182 - val_accuracy: 0.5480 - val_f1_m: 0.4367
Epoch 3/150
142/142 [==============================] - 8s 58ms/step - loss: 0.3666 - accuracy: 0.7522 - f1_m: 0.7339 - val_loss: 1.3187 - val_accuracy: 0.6607 - val_f1_m: 0.6430
Epoch 4/150
142/142 [==============================] - 8s 58ms/step - loss: 0.3374 - accuracy: 0.8209 - f1_m: 0.8182 - val_loss: 1.0460 - val_accuracy: 0.7493 - val_f1_m: 0.7468
Epoch 5/150
142/142 [==============================] - 8s 58ms/step - loss: 0.3124 - accuracy: 0.8728 - f1_m: 0.8679 - val_loss: 2.9299 - val_accuracy: 0.3740 - val_f1_m: 0.3742
Epoch 6/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2928 - accuracy: 0.8938 - f1_m: 0.8883 - val_loss: 1.2245 - val_accuracy: 0.7003 - val_f1_m: 0.6987
Epoch 7/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2805 - accuracy: 0.8871 - f1_m: 0.8858 - val_loss: 1.2606 - val_accuracy: 0.6927 - val_f1_m: 0.7019
Epoch 8/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2598 - accuracy: 0.9231 - f1_m: 0.9183 - val_loss: 0.7067 - val_accuracy: 0.8373 - val_f1_m: 0.8403
Epoch 9/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2480 - accuracy: 0.9169 - f1_m: 0.9113 - val_loss: 0.8324 - val_accuracy: 0.8090 - val_f1_m: 0.8057
Epoch 10/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2330 - accuracy: 0.9345 - f1_m: 0.9338 - val_loss: 0.4296 - val_accuracy: 0.9320 - val_f1_m: 0.9327
Epoch 11/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2174 - accuracy: 0.9556 - f1_m: 0.9539 - val_loss: 1.0145 - val_accuracy: 0.7510 - val_f1_m: 0.7539
Epoch 12/150
142/142 [==============================] - 8s 58ms/step - loss: 0.2058 - accuracy: 0.9559 - f1_m: 0.9562 - val_loss: 2.5332 - val_accuracy: 0.5090 - val_f1_m: 0.5176
Epoch 13/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1942 - accuracy: 0.9595 - f1_m: 0.9596 - val_loss: 0.4058 - val_accuracy: 0.9350 - val_f1_m: 0.9346
Epoch 14/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1831 - accuracy: 0.9692 - f1_m: 0.9667 - val_loss: 0.5229 - val_accuracy: 0.8840 - val_f1_m: 0.8859
Epoch 15/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1742 - accuracy: 0.9642 - f1_m: 0.9609 - val_loss: 0.5287 - val_accuracy: 0.8827 - val_f1_m: 0.8880
Epoch 16/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1649 - accuracy: 0.9684 - f1_m: 0.9619 - val_loss: 0.3865 - val_accuracy: 0.9380 - val_f1_m: 0.9388
Epoch 17/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1578 - accuracy: 0.9589 - f1_m: 0.9548 - val_loss: 0.5415 - val_accuracy: 0.8760 - val_f1_m: 0.8764
Epoch 18/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1494 - accuracy: 0.9612 - f1_m: 0.9579 - val_loss: 0.7424 - val_accuracy: 0.8283 - val_f1_m: 0.8335
Epoch 19/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1446 - accuracy: 0.9550 - f1_m: 0.9503 - val_loss: 1.1137 - val_accuracy: 0.7030 - val_f1_m: 0.7101
Epoch 20/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1364 - accuracy: 0.9589 - f1_m: 0.9515 - val_loss: 0.4181 - val_accuracy: 0.8987 - val_f1_m: 0.8968
Epoch 21/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1271 - accuracy: 0.9672 - f1_m: 0.9670 - val_loss: 1.3989 - val_accuracy: 0.6323 - val_f1_m: 0.6348
Epoch 22/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1189 - accuracy: 0.9791 - f1_m: 0.9761 - val_loss: 0.2421 - val_accuracy: 0.9627 - val_f1_m: 0.9621
Epoch 23/150
142/142 [==============================] - 8s 58ms/step - loss: 0.1137 - accuracy: 0.9725 - f1_m: 0.9673 - val_loss: 0.3460 - val_accuracy: 0.9243 - val_f1_m: 0.9271
Epoch 24/150
142/142 [==============================] - 9s 63ms/step - loss: 0.1077 - accuracy: 0.9761 - f1_m: 0.9766 - val_loss: 0.6000 - val_accuracy: 0.8423 - val_f1_m: 0.8513
Epoch 25/150
142/142 [==============================] - 9s 61ms/step - loss: 0.1008 - accuracy: 0.9849 - f1_m: 0.9823 - val_loss: 1.1650 - val_accuracy: 0.7193 - val_f1_m: 0.7236
Epoch 26/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0961 - accuracy: 0.9802 - f1_m: 0.9766 - val_loss: 0.2894 - val_accuracy: 0.9407 - val_f1_m: 0.9414
Epoch 27/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0916 - accuracy: 0.9788 - f1_m: 0.9794 - val_loss: 0.2154 - val_accuracy: 0.9623 - val_f1_m: 0.9620
Epoch 28/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0864 - accuracy: 0.9833 - f1_m: 0.9828 - val_loss: 0.3559 - val_accuracy: 0.9137 - val_f1_m: 0.9186
Epoch 29/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0821 - accuracy: 0.9842 - f1_m: 0.9836 - val_loss: 0.3152 - val_accuracy: 0.9240 - val_f1_m: 0.9246
Epoch 30/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0787 - accuracy: 0.9786 - f1_m: 0.9756 - val_loss: 0.4253 - val_accuracy: 0.8940 - val_f1_m: 0.8963
Epoch 31/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0777 - accuracy: 0.9708 - f1_m: 0.9683 - val_loss: 0.3910 - val_accuracy: 0.8980 - val_f1_m: 0.9015
Epoch 32/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0751 - accuracy: 0.9640 - f1_m: 0.9575 - val_loss: 0.2983 - val_accuracy: 0.9233 - val_f1_m: 0.9237
Epoch 33/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0696 - accuracy: 0.9743 - f1_m: 0.9740 - val_loss: 0.7200 - val_accuracy: 0.8033 - val_f1_m: 0.8049
Epoch 34/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0635 - accuracy: 0.9880 - f1_m: 0.9848 - val_loss: 0.4449 - val_accuracy: 0.8853 - val_f1_m: 0.8876
Epoch 35/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0720 - accuracy: 0.9328 - f1_m: 0.9323 - val_loss: 0.3653 - val_accuracy: 0.8993 - val_f1_m: 0.9022
Epoch 36/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0591 - accuracy: 0.9791 - f1_m: 0.9785 - val_loss: 0.2860 - val_accuracy: 0.9253 - val_f1_m: 0.9257
Epoch 37/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0553 - accuracy: 0.9850 - f1_m: 0.9827 - val_loss: 0.2114 - val_accuracy: 0.9507 - val_f1_m: 0.9528
Epoch 38/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0538 - accuracy: 0.9793 - f1_m: 0.9799 - val_loss: 0.3763 - val_accuracy: 0.8900 - val_f1_m: 0.8921
Epoch 39/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0496 - accuracy: 0.9885 - f1_m: 0.9886 - val_loss: 0.1814 - val_accuracy: 0.9607 - val_f1_m: 0.9608
Epoch 40/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0474 - accuracy: 0.9886 - f1_m: 0.9875 - val_loss: 0.2953 - val_accuracy: 0.9200 - val_f1_m: 0.9246
Epoch 41/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0446 - accuracy: 0.9907 - f1_m: 0.9903 - val_loss: 0.1519 - val_accuracy: 0.9680 - val_f1_m: 0.9691
Epoch 42/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0424 - accuracy: 0.9914 - f1_m: 0.9894 - val_loss: 0.1442 - val_accuracy: 0.9700 - val_f1_m: 0.9718
Epoch 43/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0405 - accuracy: 0.9898 - f1_m: 0.9883 - val_loss: 0.2474 - val_accuracy: 0.9360 - val_f1_m: 0.9341
Epoch 44/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0388 - accuracy: 0.9890 - f1_m: 0.9890 - val_loss: 0.1216 - val_accuracy: 0.9737 - val_f1_m: 0.9740
Epoch 45/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0365 - accuracy: 0.9938 - f1_m: 0.9939 - val_loss: 0.2129 - val_accuracy: 0.9447 - val_f1_m: 0.9440
Epoch 46/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0345 - accuracy: 0.9929 - f1_m: 0.9930 - val_loss: 0.1238 - val_accuracy: 0.9753 - val_f1_m: 0.9756
Epoch 47/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0329 - accuracy: 0.9942 - f1_m: 0.9938 - val_loss: 0.1584 - val_accuracy: 0.9627 - val_f1_m: 0.9603
Epoch 48/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0318 - accuracy: 0.9912 - f1_m: 0.9890 - val_loss: 0.1449 - val_accuracy: 0.9683 - val_f1_m: 0.9673
Epoch 49/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0305 - accuracy: 0.9919 - f1_m: 0.9920 - val_loss: 0.1167 - val_accuracy: 0.9767 - val_f1_m: 0.9754
Epoch 50/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0286 - accuracy: 0.9928 - f1_m: 0.9915 - val_loss: 0.1702 - val_accuracy: 0.9553 - val_f1_m: 0.9573
Epoch 51/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0277 - accuracy: 0.9911 - f1_m: 0.9908 - val_loss: 0.1081 - val_accuracy: 0.9783 - val_f1_m: 0.9789
Epoch 52/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0260 - accuracy: 0.9945 - f1_m: 0.9910 - val_loss: 0.1234 - val_accuracy: 0.9700 - val_f1_m: 0.9707
Epoch 53/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0256 - accuracy: 0.9893 - f1_m: 0.9889 - val_loss: 0.4191 - val_accuracy: 0.8710 - val_f1_m: 0.8741
Epoch 54/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0237 - accuracy: 0.9940 - f1_m: 0.9939 - val_loss: 0.1225 - val_accuracy: 0.9720 - val_f1_m: 0.9712
Epoch 55/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0230 - accuracy: 0.9928 - f1_m: 0.9915 - val_loss: 0.4859 - val_accuracy: 0.9007 - val_f1_m: 0.9036
Epoch 56/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0263 - accuracy: 0.9726 - f1_m: 0.9709 - val_loss: 0.1645 - val_accuracy: 0.9607 - val_f1_m: 0.9605
Epoch 57/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0215 - accuracy: 0.9915 - f1_m: 0.9898 - val_loss: 0.1049 - val_accuracy: 0.9753 - val_f1_m: 0.9751
Epoch 58/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0204 - accuracy: 0.9935 - f1_m: 0.9903 - val_loss: 0.1424 - val_accuracy: 0.9623 - val_f1_m: 0.9631
Epoch 59/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0228 - accuracy: 0.9781 - f1_m: 0.9758 - val_loss: 0.1697 - val_accuracy: 0.9570 - val_f1_m: 0.9571
Epoch 60/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0226 - accuracy: 0.9797 - f1_m: 0.9805 - val_loss: 0.1579 - val_accuracy: 0.9550 - val_f1_m: 0.9555
Epoch 61/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0185 - accuracy: 0.9930 - f1_m: 0.9920 - val_loss: 0.2244 - val_accuracy: 0.9367 - val_f1_m: 0.9342
Epoch 62/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0197 - accuracy: 0.9814 - f1_m: 0.9795 - val_loss: 0.6162 - val_accuracy: 0.7960 - val_f1_m: 0.7995
Epoch 63/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0175 - accuracy: 0.9910 - f1_m: 0.9906 - val_loss: 0.1252 - val_accuracy: 0.9673 - val_f1_m: 0.9685
Epoch 64/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0160 - accuracy: 0.9950 - f1_m: 0.9949 - val_loss: 0.0943 - val_accuracy: 0.9743 - val_f1_m: 0.9757
Epoch 65/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0155 - accuracy: 0.9940 - f1_m: 0.9916 - val_loss: 0.1663 - val_accuracy: 0.9533 - val_f1_m: 0.9550
Epoch 66/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0156 - accuracy: 0.9900 - f1_m: 0.9891 - val_loss: 0.1173 - val_accuracy: 0.9667 - val_f1_m: 0.9681
Epoch 67/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0150 - accuracy: 0.9896 - f1_m: 0.9884 - val_loss: 0.0849 - val_accuracy: 0.9793 - val_f1_m: 0.9791
Epoch 68/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0140 - accuracy: 0.9930 - f1_m: 0.9918 - val_loss: 0.1158 - val_accuracy: 0.9683 - val_f1_m: 0.9691
Epoch 69/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0135 - accuracy: 0.9925 - f1_m: 0.9929 - val_loss: 0.1156 - val_accuracy: 0.9660 - val_f1_m: 0.9659
Epoch 70/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0133 - accuracy: 0.9926 - f1_m: 0.9894 - val_loss: 0.0879 - val_accuracy: 0.9787 - val_f1_m: 0.9779
Epoch 71/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0136 - accuracy: 0.9888 - f1_m: 0.9869 - val_loss: 0.1888 - val_accuracy: 0.9450 - val_f1_m: 0.9449
Epoch 72/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0122 - accuracy: 0.9934 - f1_m: 0.9910 - val_loss: 0.1258 - val_accuracy: 0.9663 - val_f1_m: 0.9661
Epoch 73/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0127 - accuracy: 0.9869 - f1_m: 0.9842 - val_loss: 0.1719 - val_accuracy: 0.9477 - val_f1_m: 0.9494
Epoch 74/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0138 - accuracy: 0.9817 - f1_m: 0.9809 - val_loss: 0.1942 - val_accuracy: 0.9450 - val_f1_m: 0.9452
Epoch 75/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0111 - accuracy: 0.9944 - f1_m: 0.9939 - val_loss: 0.0703 - val_accuracy: 0.9817 - val_f1_m: 0.9823
Epoch 76/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0105 - accuracy: 0.9955 - f1_m: 0.9953 - val_loss: 0.1181 - val_accuracy: 0.9643 - val_f1_m: 0.9675
Epoch 77/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0100 - accuracy: 0.9968 - f1_m: 0.9971 - val_loss: 0.0798 - val_accuracy: 0.9790 - val_f1_m: 0.9792
Epoch 78/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0097 - accuracy: 0.9959 - f1_m: 0.9962 - val_loss: 0.0728 - val_accuracy: 0.9830 - val_f1_m: 0.9829
Epoch 79/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0092 - accuracy: 0.9977 - f1_m: 0.9977 - val_loss: 0.0903 - val_accuracy: 0.9793 - val_f1_m: 0.9793
Epoch 80/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0088 - accuracy: 0.9971 - f1_m: 0.9968 - val_loss: 0.0851 - val_accuracy: 0.9770 - val_f1_m: 0.9776
Epoch 81/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0086 - accuracy: 0.9972 - f1_m: 0.9968 - val_loss: 0.0781 - val_accuracy: 0.9817 - val_f1_m: 0.9818
Epoch 82/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0090 - accuracy: 0.9942 - f1_m: 0.9942 - val_loss: 0.1855 - val_accuracy: 0.9407 - val_f1_m: 0.9417
Epoch 83/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0081 - accuracy: 0.9970 - f1_m: 0.9953 - val_loss: 0.1026 - val_accuracy: 0.9723 - val_f1_m: 0.9716
Epoch 84/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0088 - accuracy: 0.9926 - f1_m: 0.9906 - val_loss: 0.0741 - val_accuracy: 0.9820 - val_f1_m: 0.9826
Epoch 85/150
142/142 [==============================] - 9s 60ms/step - loss: 0.0086 - accuracy: 0.9942 - f1_m: 0.9940 - val_loss: 0.1409 - val_accuracy: 0.9627 - val_f1_m: 0.9612
Epoch 85: early stopping
CPU times: total: 4min 59s
Wall time: 12min 12s
Out[ ]:
<keras.callbacks.History at 0x1de5cba0730>
In [ ]:
%%time
CustomModel_31_DA = create_Custom_model((31, 31, 1), 15)
CustomModel_31_DA.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
CustomModel_31_DA.fit(train_generator_31, epochs=150, validation_data=dataset_test_31, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 5s 27ms/step - loss: 0.4665 - accuracy: 0.3095 - f1_m: 0.1313 - val_loss: 2.8437 - val_accuracy: 0.1683 - val_f1_m: 0.0026
Epoch 2/150
142/142 [==============================] - 4s 24ms/step - loss: 0.4033 - accuracy: 0.5836 - f1_m: 0.4956 - val_loss: 2.1785 - val_accuracy: 0.3510 - val_f1_m: 0.2680
Epoch 3/150
142/142 [==============================] - 4s 24ms/step - loss: 0.3642 - accuracy: 0.7113 - f1_m: 0.6815 - val_loss: 1.3861 - val_accuracy: 0.6620 - val_f1_m: 0.6248
Epoch 4/150
142/142 [==============================] - 4s 24ms/step - loss: 0.3348 - accuracy: 0.7816 - f1_m: 0.7702 - val_loss: 1.1378 - val_accuracy: 0.7320 - val_f1_m: 0.7182
Epoch 5/150
142/142 [==============================] - 4s 25ms/step - loss: 0.3112 - accuracy: 0.8322 - f1_m: 0.8230 - val_loss: 0.7999 - val_accuracy: 0.8383 - val_f1_m: 0.8354
Epoch 6/150
142/142 [==============================] - 4s 25ms/step - loss: 0.2903 - accuracy: 0.8662 - f1_m: 0.8547 - val_loss: 2.0145 - val_accuracy: 0.5390 - val_f1_m: 0.5296
Epoch 7/150
142/142 [==============================] - 4s 24ms/step - loss: 0.2782 - accuracy: 0.8504 - f1_m: 0.8438 - val_loss: 1.0195 - val_accuracy: 0.7480 - val_f1_m: 0.7458
Epoch 8/150
142/142 [==============================] - 4s 24ms/step - loss: 0.2579 - accuracy: 0.8943 - f1_m: 0.8912 - val_loss: 1.4138 - val_accuracy: 0.6440 - val_f1_m: 0.6509
Epoch 9/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2455 - accuracy: 0.8949 - f1_m: 0.8923 - val_loss: 0.6127 - val_accuracy: 0.8830 - val_f1_m: 0.8764
Epoch 10/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2284 - accuracy: 0.9267 - f1_m: 0.9240 - val_loss: 0.5663 - val_accuracy: 0.8873 - val_f1_m: 0.8915
Epoch 11/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2153 - accuracy: 0.9366 - f1_m: 0.9333 - val_loss: 0.8124 - val_accuracy: 0.7903 - val_f1_m: 0.7881
Epoch 12/150
142/142 [==============================] - 3s 24ms/step - loss: 0.2072 - accuracy: 0.9196 - f1_m: 0.9183 - val_loss: 0.6137 - val_accuracy: 0.8697 - val_f1_m: 0.8718
Epoch 13/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1923 - accuracy: 0.9465 - f1_m: 0.9423 - val_loss: 0.5988 - val_accuracy: 0.8677 - val_f1_m: 0.8670
Epoch 14/150
142/142 [==============================] - 4s 24ms/step - loss: 0.1819 - accuracy: 0.9523 - f1_m: 0.9490 - val_loss: 0.8337 - val_accuracy: 0.7867 - val_f1_m: 0.7888
Epoch 15/150
142/142 [==============================] - 4s 24ms/step - loss: 0.1765 - accuracy: 0.9344 - f1_m: 0.9320 - val_loss: 0.5611 - val_accuracy: 0.8763 - val_f1_m: 0.8810
Epoch 16/150
142/142 [==============================] - 4s 24ms/step - loss: 0.1628 - accuracy: 0.9593 - f1_m: 0.9587 - val_loss: 0.5524 - val_accuracy: 0.8757 - val_f1_m: 0.8756
Epoch 17/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1540 - accuracy: 0.9637 - f1_m: 0.9612 - val_loss: 0.6562 - val_accuracy: 0.8427 - val_f1_m: 0.8440
Epoch 18/150
142/142 [==============================] - 3s 24ms/step - loss: 0.1515 - accuracy: 0.9337 - f1_m: 0.9342 - val_loss: 0.6055 - val_accuracy: 0.8523 - val_f1_m: 0.8572
Epoch 19/150
142/142 [==============================] - 4s 25ms/step - loss: 0.1390 - accuracy: 0.9639 - f1_m: 0.9638 - val_loss: 0.5870 - val_accuracy: 0.8553 - val_f1_m: 0.8569
Epoch 20/150
142/142 [==============================] - 4s 25ms/step - loss: 0.1320 - accuracy: 0.9623 - f1_m: 0.9604 - val_loss: 0.6023 - val_accuracy: 0.8483 - val_f1_m: 0.8484
Epoch 21/150
142/142 [==============================] - 4s 25ms/step - loss: 0.1259 - accuracy: 0.9626 - f1_m: 0.9634 - val_loss: 0.3880 - val_accuracy: 0.9167 - val_f1_m: 0.9180
Epoch 22/150
142/142 [==============================] - 4s 25ms/step - loss: 0.1176 - accuracy: 0.9752 - f1_m: 0.9751 - val_loss: 0.3770 - val_accuracy: 0.9150 - val_f1_m: 0.9144
Epoch 23/150
142/142 [==============================] - 4s 24ms/step - loss: 0.1116 - accuracy: 0.9718 - f1_m: 0.9707 - val_loss: 0.6312 - val_accuracy: 0.8497 - val_f1_m: 0.8545
Epoch 24/150
142/142 [==============================] - 4s 24ms/step - loss: 0.1090 - accuracy: 0.9572 - f1_m: 0.9549 - val_loss: 0.5307 - val_accuracy: 0.8643 - val_f1_m: 0.8651
Epoch 25/150
142/142 [==============================] - 4s 24ms/step - loss: 0.1041 - accuracy: 0.9581 - f1_m: 0.9583 - val_loss: 0.3986 - val_accuracy: 0.9067 - val_f1_m: 0.9125
Epoch 26/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0954 - accuracy: 0.9794 - f1_m: 0.9781 - val_loss: 0.4389 - val_accuracy: 0.8917 - val_f1_m: 0.8939
Epoch 27/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0909 - accuracy: 0.9753 - f1_m: 0.9732 - val_loss: 0.3898 - val_accuracy: 0.9030 - val_f1_m: 0.9031
Epoch 28/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0863 - accuracy: 0.9783 - f1_m: 0.9765 - val_loss: 0.8918 - val_accuracy: 0.7550 - val_f1_m: 0.7546
Epoch 29/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0869 - accuracy: 0.9557 - f1_m: 0.9538 - val_loss: 0.3368 - val_accuracy: 0.9240 - val_f1_m: 0.9224
Epoch 30/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0796 - accuracy: 0.9714 - f1_m: 0.9706 - val_loss: 0.3471 - val_accuracy: 0.9110 - val_f1_m: 0.9146
Epoch 31/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0739 - accuracy: 0.9822 - f1_m: 0.9822 - val_loss: 0.3067 - val_accuracy: 0.9247 - val_f1_m: 0.9274
Epoch 32/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0701 - accuracy: 0.9833 - f1_m: 0.9811 - val_loss: 0.3183 - val_accuracy: 0.9283 - val_f1_m: 0.9247
Epoch 33/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0674 - accuracy: 0.9801 - f1_m: 0.9796 - val_loss: 0.2532 - val_accuracy: 0.9443 - val_f1_m: 0.9466
Epoch 34/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0627 - accuracy: 0.9878 - f1_m: 0.9872 - val_loss: 0.2529 - val_accuracy: 0.9460 - val_f1_m: 0.9479
Epoch 35/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0600 - accuracy: 0.9870 - f1_m: 0.9858 - val_loss: 0.2572 - val_accuracy: 0.9437 - val_f1_m: 0.9439
Epoch 36/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0574 - accuracy: 0.9853 - f1_m: 0.9845 - val_loss: 0.3107 - val_accuracy: 0.9243 - val_f1_m: 0.9236
Epoch 37/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0546 - accuracy: 0.9856 - f1_m: 0.9854 - val_loss: 0.3073 - val_accuracy: 0.9200 - val_f1_m: 0.9210
Epoch 38/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0516 - accuracy: 0.9867 - f1_m: 0.9866 - val_loss: 0.2543 - val_accuracy: 0.9397 - val_f1_m: 0.9377
Epoch 39/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0490 - accuracy: 0.9887 - f1_m: 0.9887 - val_loss: 0.3247 - val_accuracy: 0.9173 - val_f1_m: 0.9188
Epoch 40/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0465 - accuracy: 0.9896 - f1_m: 0.9898 - val_loss: 0.2430 - val_accuracy: 0.9427 - val_f1_m: 0.9424
Epoch 41/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0444 - accuracy: 0.9911 - f1_m: 0.9881 - val_loss: 0.2307 - val_accuracy: 0.9400 - val_f1_m: 0.9405
Epoch 42/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0435 - accuracy: 0.9838 - f1_m: 0.9840 - val_loss: 0.2198 - val_accuracy: 0.9473 - val_f1_m: 0.9464
Epoch 43/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0405 - accuracy: 0.9901 - f1_m: 0.9873 - val_loss: 0.2339 - val_accuracy: 0.9413 - val_f1_m: 0.9411
Epoch 44/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0392 - accuracy: 0.9865 - f1_m: 0.9859 - val_loss: 0.2213 - val_accuracy: 0.9473 - val_f1_m: 0.9471
Epoch 45/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0369 - accuracy: 0.9904 - f1_m: 0.9904 - val_loss: 0.2261 - val_accuracy: 0.9423 - val_f1_m: 0.9418
Epoch 46/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0355 - accuracy: 0.9916 - f1_m: 0.9854 - val_loss: 0.3039 - val_accuracy: 0.9183 - val_f1_m: 0.9199
Epoch 47/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0371 - accuracy: 0.9715 - f1_m: 0.9706 - val_loss: 0.2578 - val_accuracy: 0.9363 - val_f1_m: 0.9361
Epoch 48/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0324 - accuracy: 0.9910 - f1_m: 0.9892 - val_loss: 0.2120 - val_accuracy: 0.9493 - val_f1_m: 0.9504
Epoch 49/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0320 - accuracy: 0.9828 - f1_m: 0.9818 - val_loss: 0.2591 - val_accuracy: 0.9303 - val_f1_m: 0.9318
Epoch 50/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0303 - accuracy: 0.9862 - f1_m: 0.9859 - val_loss: 0.1995 - val_accuracy: 0.9473 - val_f1_m: 0.9473
Epoch 51/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0281 - accuracy: 0.9926 - f1_m: 0.9902 - val_loss: 0.2532 - val_accuracy: 0.9257 - val_f1_m: 0.9282
Epoch 52/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0275 - accuracy: 0.9901 - f1_m: 0.9891 - val_loss: 0.2212 - val_accuracy: 0.9413 - val_f1_m: 0.9419
Epoch 53/150
142/142 [==============================] - 4s 26ms/step - loss: 0.0257 - accuracy: 0.9930 - f1_m: 0.9928 - val_loss: 0.2817 - val_accuracy: 0.9240 - val_f1_m: 0.9221
Epoch 54/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0250 - accuracy: 0.9914 - f1_m: 0.9894 - val_loss: 0.2427 - val_accuracy: 0.9320 - val_f1_m: 0.9338
Epoch 55/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0279 - accuracy: 0.9730 - f1_m: 0.9743 - val_loss: 0.2573 - val_accuracy: 0.9243 - val_f1_m: 0.9271
Epoch 56/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0248 - accuracy: 0.9847 - f1_m: 0.9826 - val_loss: 0.2039 - val_accuracy: 0.9443 - val_f1_m: 0.9478
Epoch 57/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0230 - accuracy: 0.9869 - f1_m: 0.9866 - val_loss: 0.1969 - val_accuracy: 0.9490 - val_f1_m: 0.9529
Epoch 58/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0209 - accuracy: 0.9939 - f1_m: 0.9929 - val_loss: 0.2929 - val_accuracy: 0.9163 - val_f1_m: 0.9165
Epoch 59/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0203 - accuracy: 0.9932 - f1_m: 0.9928 - val_loss: 0.2001 - val_accuracy: 0.9450 - val_f1_m: 0.9459
Epoch 60/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0192 - accuracy: 0.9947 - f1_m: 0.9941 - val_loss: 0.1641 - val_accuracy: 0.9590 - val_f1_m: 0.9600
Epoch 61/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0185 - accuracy: 0.9945 - f1_m: 0.9944 - val_loss: 0.1785 - val_accuracy: 0.9527 - val_f1_m: 0.9518
Epoch 62/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0176 - accuracy: 0.9952 - f1_m: 0.9950 - val_loss: 0.1783 - val_accuracy: 0.9520 - val_f1_m: 0.9513
Epoch 63/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0172 - accuracy: 0.9930 - f1_m: 0.9933 - val_loss: 0.1816 - val_accuracy: 0.9540 - val_f1_m: 0.9530
Epoch 64/150
142/142 [==============================] - 4s 25ms/step - loss: 0.0162 - accuracy: 0.9959 - f1_m: 0.9953 - val_loss: 0.1750 - val_accuracy: 0.9507 - val_f1_m: 0.9533
Epoch 65/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0160 - accuracy: 0.9948 - f1_m: 0.9933 - val_loss: 0.2057 - val_accuracy: 0.9467 - val_f1_m: 0.9488
Epoch 66/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0159 - accuracy: 0.9905 - f1_m: 0.9910 - val_loss: 0.1829 - val_accuracy: 0.9520 - val_f1_m: 0.9525
Epoch 67/150
142/142 [==============================] - 4s 24ms/step - loss: 0.0155 - accuracy: 0.9898 - f1_m: 0.9891 - val_loss: 0.3138 - val_accuracy: 0.9083 - val_f1_m: 0.9092
Epoch 68/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0177 - accuracy: 0.9750 - f1_m: 0.9740 - val_loss: 0.2753 - val_accuracy: 0.9207 - val_f1_m: 0.9227
Epoch 69/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0157 - accuracy: 0.9878 - f1_m: 0.9866 - val_loss: 0.2046 - val_accuracy: 0.9390 - val_f1_m: 0.9413
Epoch 70/150
142/142 [==============================] - 3s 24ms/step - loss: 0.0144 - accuracy: 0.9903 - f1_m: 0.9868 - val_loss: 0.2280 - val_accuracy: 0.9383 - val_f1_m: 0.9393
Epoch 70: early stopping
CPU times: total: 1min 27s
Wall time: 4min 13s
Out[ ]:
<keras.callbacks.History at 0x1de2fa0bf10>
In [ ]:
evaluate_and_save_model(CustomModel_128_DA, 'CustomModel_128_DA', 64,save_models=False)
evaluate_and_save_model(CustomModel_31_DA, 'CustomModel_31_DA', 64,save_models=False)
Model Name            CustomModel_128_DA
Epochs                                85
Batch Size                            64
Train Loss                      0.009669
Val Loss                        0.072805
Train Acc                       0.995902
Val Acc                            0.983
[Train - Val] Acc               0.012902
[Train - Val] Loss             -0.063136
Name: CustomModel_128_DA, dtype: object
Model Name            CustomModel_31_DA
Epochs                               70
Batch Size                           64
Train Loss                      0.01923
Val Loss                       0.164061
Train Acc                      0.994683
Val Acc                           0.959
[Train - Val] Acc              0.035683
[Train - Val] Loss             -0.14483
Name: CustomModel_31_DA, dtype: object
In [ ]:
customModel_history_128_DA = json.load(open('./models/CustomModel_128_DA_history.json', 'r'))
customModel_history_31_DA = json.load(open('./models/CustomModel_31_DA_history.json', 'r'))
compare_curves(customModel_history_31_DA, customModel_history_128_DA, '31x31', '128x128')
No description has been provided for this image

Observations:

  • We can see that with both data augmented images and a dropout layer, our accuracy and loss graph has increased amounts of flucutations
    • This can be becauses Data Augmentation includes more variablilty in our dataset by applying random transformations to the training images
  • With the inclusion of Data augmentation, we have effectively prevented overfitting as compared to our custom model trained on non agumented images.

Custom Resnet Network¶

Resnets (Residual Networks) were first introduced in 2015 ,by Microsoft researchers, Kaiming He, Xiangyu Zhang, Shaoqing Ren and Jian Sun. In their paper "Deep Residual Learning for Image Recognition" [4]. They talked on the problem of how deeper neural networks are harder to train and they provide evidence on how Resnets are easier to optimize and learn in much deeper neural networks as compared to other neural networks such as VGG nets during 2015.

First of all why Resnet?¶

Resnet's unqiue architechture of skipping connections backwards from later layers to intital filters, where there are 2 pathways for the gradient to transit back to the inputlayer while tranversing a residual block. allowing us to combat a big problem in neural networks, vanishing/exploding gradients. Where when our model network gets too deep and the gradient calculated from backpropagation gradually goes to 0 after multiple applications of the chain rule. Resnet allows us to have deeper and more complex models without encountering the problem of vanishing and exploding gradients.

Architechture of a regular residual network¶

No description has been provided for this image

Source

Here for example is a 34 layer Resnet, where the main thing that stands out is the skip connections it has. While th architecture is organized into four stages with 3, 4, 6, and 3 residual blocks.The residual blocks consist of 2 stacked convolutional layers with batch normalization and ReLU activations. After the last stage, a global average pooling layer is applied to reduce spatial dimensions. We can see that there are 2 different types of skip connections in this model (dotted and non-dotted lines). An identity skip connection and a projection skip connection. What is the difference between the 2? In projection skip connections,it is similair to a normal identity skip connection except additional operations(eg. a 1x1 convolutional layer) are applied to the input to match the spatial dimensions of the output of our residual block.

In [ ]:
resnet50_example = tf.keras.applications.ResNet50(
    include_top=False,
    weights=None,
    input_shape=(128, 128, 1),
    pooling='avg',
    classes=15,
)
resnet50_example.summary()
Model: "resnet50"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_2 (InputLayer)           [(None, 128, 128, 1  0           []                               
                                )]                                                                
                                                                                                  
 conv1_pad (ZeroPadding2D)      (None, 134, 134, 1)  0           ['input_2[0][0]']                
                                                                                                  
 conv1_conv (Conv2D)            (None, 64, 64, 64)   3200        ['conv1_pad[0][0]']              
                                                                                                  
 conv1_bn (BatchNormalization)  (None, 64, 64, 64)   256         ['conv1_conv[0][0]']             
                                                                                                  
 conv1_relu (Activation)        (None, 64, 64, 64)   0           ['conv1_bn[0][0]']               
                                                                                                  
 pool1_pad (ZeroPadding2D)      (None, 66, 66, 64)   0           ['conv1_relu[0][0]']             
                                                                                                  
 pool1_pool (MaxPooling2D)      (None, 32, 32, 64)   0           ['pool1_pad[0][0]']              
                                                                                                  
 conv2_block1_1_conv (Conv2D)   (None, 32, 32, 64)   4160        ['pool1_pool[0][0]']             
                                                                                                  
 conv2_block1_1_bn (BatchNormal  (None, 32, 32, 64)  256         ['conv2_block1_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block1_1_relu (Activatio  (None, 32, 32, 64)  0           ['conv2_block1_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv2_block1_2_conv (Conv2D)   (None, 32, 32, 64)   36928       ['conv2_block1_1_relu[0][0]']    
                                                                                                  
 conv2_block1_2_bn (BatchNormal  (None, 32, 32, 64)  256         ['conv2_block1_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block1_2_relu (Activatio  (None, 32, 32, 64)  0           ['conv2_block1_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv2_block1_0_conv (Conv2D)   (None, 32, 32, 256)  16640       ['pool1_pool[0][0]']             
                                                                                                  
 conv2_block1_3_conv (Conv2D)   (None, 32, 32, 256)  16640       ['conv2_block1_2_relu[0][0]']    
                                                                                                  
 conv2_block1_0_bn (BatchNormal  (None, 32, 32, 256)  1024       ['conv2_block1_0_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block1_3_bn (BatchNormal  (None, 32, 32, 256)  1024       ['conv2_block1_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block1_add (Add)         (None, 32, 32, 256)  0           ['conv2_block1_0_bn[0][0]',      
                                                                  'conv2_block1_3_bn[0][0]']      
                                                                                                  
 conv2_block1_out (Activation)  (None, 32, 32, 256)  0           ['conv2_block1_add[0][0]']       
                                                                                                  
 conv2_block2_1_conv (Conv2D)   (None, 32, 32, 64)   16448       ['conv2_block1_out[0][0]']       
                                                                                                  
 conv2_block2_1_bn (BatchNormal  (None, 32, 32, 64)  256         ['conv2_block2_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block2_1_relu (Activatio  (None, 32, 32, 64)  0           ['conv2_block2_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv2_block2_2_conv (Conv2D)   (None, 32, 32, 64)   36928       ['conv2_block2_1_relu[0][0]']    
                                                                                                  
 conv2_block2_2_bn (BatchNormal  (None, 32, 32, 64)  256         ['conv2_block2_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block2_2_relu (Activatio  (None, 32, 32, 64)  0           ['conv2_block2_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv2_block2_3_conv (Conv2D)   (None, 32, 32, 256)  16640       ['conv2_block2_2_relu[0][0]']    
                                                                                                  
 conv2_block2_3_bn (BatchNormal  (None, 32, 32, 256)  1024       ['conv2_block2_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block2_add (Add)         (None, 32, 32, 256)  0           ['conv2_block1_out[0][0]',       
                                                                  'conv2_block2_3_bn[0][0]']      
                                                                                                  
 conv2_block2_out (Activation)  (None, 32, 32, 256)  0           ['conv2_block2_add[0][0]']       
                                                                                                  
 conv2_block3_1_conv (Conv2D)   (None, 32, 32, 64)   16448       ['conv2_block2_out[0][0]']       
                                                                                                  
 conv2_block3_1_bn (BatchNormal  (None, 32, 32, 64)  256         ['conv2_block3_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block3_1_relu (Activatio  (None, 32, 32, 64)  0           ['conv2_block3_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv2_block3_2_conv (Conv2D)   (None, 32, 32, 64)   36928       ['conv2_block3_1_relu[0][0]']    
                                                                                                  
 conv2_block3_2_bn (BatchNormal  (None, 32, 32, 64)  256         ['conv2_block3_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block3_2_relu (Activatio  (None, 32, 32, 64)  0           ['conv2_block3_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv2_block3_3_conv (Conv2D)   (None, 32, 32, 256)  16640       ['conv2_block3_2_relu[0][0]']    
                                                                                                  
 conv2_block3_3_bn (BatchNormal  (None, 32, 32, 256)  1024       ['conv2_block3_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv2_block3_add (Add)         (None, 32, 32, 256)  0           ['conv2_block2_out[0][0]',       
                                                                  'conv2_block3_3_bn[0][0]']      
                                                                                                  
 conv2_block3_out (Activation)  (None, 32, 32, 256)  0           ['conv2_block3_add[0][0]']       
                                                                                                  
 conv3_block1_1_conv (Conv2D)   (None, 16, 16, 128)  32896       ['conv2_block3_out[0][0]']       
                                                                                                  
 conv3_block1_1_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block1_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block1_1_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block1_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block1_2_conv (Conv2D)   (None, 16, 16, 128)  147584      ['conv3_block1_1_relu[0][0]']    
                                                                                                  
 conv3_block1_2_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block1_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block1_2_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block1_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block1_0_conv (Conv2D)   (None, 16, 16, 512)  131584      ['conv2_block3_out[0][0]']       
                                                                                                  
 conv3_block1_3_conv (Conv2D)   (None, 16, 16, 512)  66048       ['conv3_block1_2_relu[0][0]']    
                                                                                                  
 conv3_block1_0_bn (BatchNormal  (None, 16, 16, 512)  2048       ['conv3_block1_0_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block1_3_bn (BatchNormal  (None, 16, 16, 512)  2048       ['conv3_block1_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block1_add (Add)         (None, 16, 16, 512)  0           ['conv3_block1_0_bn[0][0]',      
                                                                  'conv3_block1_3_bn[0][0]']      
                                                                                                  
 conv3_block1_out (Activation)  (None, 16, 16, 512)  0           ['conv3_block1_add[0][0]']       
                                                                                                  
 conv3_block2_1_conv (Conv2D)   (None, 16, 16, 128)  65664       ['conv3_block1_out[0][0]']       
                                                                                                  
 conv3_block2_1_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block2_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block2_1_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block2_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block2_2_conv (Conv2D)   (None, 16, 16, 128)  147584      ['conv3_block2_1_relu[0][0]']    
                                                                                                  
 conv3_block2_2_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block2_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block2_2_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block2_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block2_3_conv (Conv2D)   (None, 16, 16, 512)  66048       ['conv3_block2_2_relu[0][0]']    
                                                                                                  
 conv3_block2_3_bn (BatchNormal  (None, 16, 16, 512)  2048       ['conv3_block2_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block2_add (Add)         (None, 16, 16, 512)  0           ['conv3_block1_out[0][0]',       
                                                                  'conv3_block2_3_bn[0][0]']      
                                                                                                  
 conv3_block2_out (Activation)  (None, 16, 16, 512)  0           ['conv3_block2_add[0][0]']       
                                                                                                  
 conv3_block3_1_conv (Conv2D)   (None, 16, 16, 128)  65664       ['conv3_block2_out[0][0]']       
                                                                                                  
 conv3_block3_1_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block3_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block3_1_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block3_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block3_2_conv (Conv2D)   (None, 16, 16, 128)  147584      ['conv3_block3_1_relu[0][0]']    
                                                                                                  
 conv3_block3_2_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block3_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block3_2_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block3_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block3_3_conv (Conv2D)   (None, 16, 16, 512)  66048       ['conv3_block3_2_relu[0][0]']    
                                                                                                  
 conv3_block3_3_bn (BatchNormal  (None, 16, 16, 512)  2048       ['conv3_block3_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block3_add (Add)         (None, 16, 16, 512)  0           ['conv3_block2_out[0][0]',       
                                                                  'conv3_block3_3_bn[0][0]']      
                                                                                                  
 conv3_block3_out (Activation)  (None, 16, 16, 512)  0           ['conv3_block3_add[0][0]']       
                                                                                                  
 conv3_block4_1_conv (Conv2D)   (None, 16, 16, 128)  65664       ['conv3_block3_out[0][0]']       
                                                                                                  
 conv3_block4_1_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block4_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block4_1_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block4_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block4_2_conv (Conv2D)   (None, 16, 16, 128)  147584      ['conv3_block4_1_relu[0][0]']    
                                                                                                  
 conv3_block4_2_bn (BatchNormal  (None, 16, 16, 128)  512        ['conv3_block4_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block4_2_relu (Activatio  (None, 16, 16, 128)  0          ['conv3_block4_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv3_block4_3_conv (Conv2D)   (None, 16, 16, 512)  66048       ['conv3_block4_2_relu[0][0]']    
                                                                                                  
 conv3_block4_3_bn (BatchNormal  (None, 16, 16, 512)  2048       ['conv3_block4_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv3_block4_add (Add)         (None, 16, 16, 512)  0           ['conv3_block3_out[0][0]',       
                                                                  'conv3_block4_3_bn[0][0]']      
                                                                                                  
 conv3_block4_out (Activation)  (None, 16, 16, 512)  0           ['conv3_block4_add[0][0]']       
                                                                                                  
 conv4_block1_1_conv (Conv2D)   (None, 8, 8, 256)    131328      ['conv3_block4_out[0][0]']       
                                                                                                  
 conv4_block1_1_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block1_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block1_1_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block1_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block1_2_conv (Conv2D)   (None, 8, 8, 256)    590080      ['conv4_block1_1_relu[0][0]']    
                                                                                                  
 conv4_block1_2_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block1_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block1_2_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block1_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block1_0_conv (Conv2D)   (None, 8, 8, 1024)   525312      ['conv3_block4_out[0][0]']       
                                                                                                  
 conv4_block1_3_conv (Conv2D)   (None, 8, 8, 1024)   263168      ['conv4_block1_2_relu[0][0]']    
                                                                                                  
 conv4_block1_0_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block1_0_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block1_3_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block1_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block1_add (Add)         (None, 8, 8, 1024)   0           ['conv4_block1_0_bn[0][0]',      
                                                                  'conv4_block1_3_bn[0][0]']      
                                                                                                  
 conv4_block1_out (Activation)  (None, 8, 8, 1024)   0           ['conv4_block1_add[0][0]']       
                                                                                                  
 conv4_block2_1_conv (Conv2D)   (None, 8, 8, 256)    262400      ['conv4_block1_out[0][0]']       
                                                                                                  
 conv4_block2_1_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block2_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block2_1_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block2_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block2_2_conv (Conv2D)   (None, 8, 8, 256)    590080      ['conv4_block2_1_relu[0][0]']    
                                                                                                  
 conv4_block2_2_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block2_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block2_2_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block2_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block2_3_conv (Conv2D)   (None, 8, 8, 1024)   263168      ['conv4_block2_2_relu[0][0]']    
                                                                                                  
 conv4_block2_3_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block2_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block2_add (Add)         (None, 8, 8, 1024)   0           ['conv4_block1_out[0][0]',       
                                                                  'conv4_block2_3_bn[0][0]']      
                                                                                                  
 conv4_block2_out (Activation)  (None, 8, 8, 1024)   0           ['conv4_block2_add[0][0]']       
                                                                                                  
 conv4_block3_1_conv (Conv2D)   (None, 8, 8, 256)    262400      ['conv4_block2_out[0][0]']       
                                                                                                  
 conv4_block3_1_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block3_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block3_1_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block3_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block3_2_conv (Conv2D)   (None, 8, 8, 256)    590080      ['conv4_block3_1_relu[0][0]']    
                                                                                                  
 conv4_block3_2_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block3_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block3_2_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block3_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block3_3_conv (Conv2D)   (None, 8, 8, 1024)   263168      ['conv4_block3_2_relu[0][0]']    
                                                                                                  
 conv4_block3_3_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block3_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block3_add (Add)         (None, 8, 8, 1024)   0           ['conv4_block2_out[0][0]',       
                                                                  'conv4_block3_3_bn[0][0]']      
                                                                                                  
 conv4_block3_out (Activation)  (None, 8, 8, 1024)   0           ['conv4_block3_add[0][0]']       
                                                                                                  
 conv4_block4_1_conv (Conv2D)   (None, 8, 8, 256)    262400      ['conv4_block3_out[0][0]']       
                                                                                                  
 conv4_block4_1_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block4_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block4_1_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block4_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block4_2_conv (Conv2D)   (None, 8, 8, 256)    590080      ['conv4_block4_1_relu[0][0]']    
                                                                                                  
 conv4_block4_2_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block4_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block4_2_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block4_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block4_3_conv (Conv2D)   (None, 8, 8, 1024)   263168      ['conv4_block4_2_relu[0][0]']    
                                                                                                  
 conv4_block4_3_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block4_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block4_add (Add)         (None, 8, 8, 1024)   0           ['conv4_block3_out[0][0]',       
                                                                  'conv4_block4_3_bn[0][0]']      
                                                                                                  
 conv4_block4_out (Activation)  (None, 8, 8, 1024)   0           ['conv4_block4_add[0][0]']       
                                                                                                  
 conv4_block5_1_conv (Conv2D)   (None, 8, 8, 256)    262400      ['conv4_block4_out[0][0]']       
                                                                                                  
 conv4_block5_1_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block5_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block5_1_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block5_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block5_2_conv (Conv2D)   (None, 8, 8, 256)    590080      ['conv4_block5_1_relu[0][0]']    
                                                                                                  
 conv4_block5_2_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block5_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block5_2_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block5_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block5_3_conv (Conv2D)   (None, 8, 8, 1024)   263168      ['conv4_block5_2_relu[0][0]']    
                                                                                                  
 conv4_block5_3_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block5_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block5_add (Add)         (None, 8, 8, 1024)   0           ['conv4_block4_out[0][0]',       
                                                                  'conv4_block5_3_bn[0][0]']      
                                                                                                  
 conv4_block5_out (Activation)  (None, 8, 8, 1024)   0           ['conv4_block5_add[0][0]']       
                                                                                                  
 conv4_block6_1_conv (Conv2D)   (None, 8, 8, 256)    262400      ['conv4_block5_out[0][0]']       
                                                                                                  
 conv4_block6_1_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block6_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block6_1_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block6_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block6_2_conv (Conv2D)   (None, 8, 8, 256)    590080      ['conv4_block6_1_relu[0][0]']    
                                                                                                  
 conv4_block6_2_bn (BatchNormal  (None, 8, 8, 256)   1024        ['conv4_block6_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block6_2_relu (Activatio  (None, 8, 8, 256)   0           ['conv4_block6_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv4_block6_3_conv (Conv2D)   (None, 8, 8, 1024)   263168      ['conv4_block6_2_relu[0][0]']    
                                                                                                  
 conv4_block6_3_bn (BatchNormal  (None, 8, 8, 1024)  4096        ['conv4_block6_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv4_block6_add (Add)         (None, 8, 8, 1024)   0           ['conv4_block5_out[0][0]',       
                                                                  'conv4_block6_3_bn[0][0]']      
                                                                                                  
 conv4_block6_out (Activation)  (None, 8, 8, 1024)   0           ['conv4_block6_add[0][0]']       
                                                                                                  
 conv5_block1_1_conv (Conv2D)   (None, 4, 4, 512)    524800      ['conv4_block6_out[0][0]']       
                                                                                                  
 conv5_block1_1_bn (BatchNormal  (None, 4, 4, 512)   2048        ['conv5_block1_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block1_1_relu (Activatio  (None, 4, 4, 512)   0           ['conv5_block1_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv5_block1_2_conv (Conv2D)   (None, 4, 4, 512)    2359808     ['conv5_block1_1_relu[0][0]']    
                                                                                                  
 conv5_block1_2_bn (BatchNormal  (None, 4, 4, 512)   2048        ['conv5_block1_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block1_2_relu (Activatio  (None, 4, 4, 512)   0           ['conv5_block1_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv5_block1_0_conv (Conv2D)   (None, 4, 4, 2048)   2099200     ['conv4_block6_out[0][0]']       
                                                                                                  
 conv5_block1_3_conv (Conv2D)   (None, 4, 4, 2048)   1050624     ['conv5_block1_2_relu[0][0]']    
                                                                                                  
 conv5_block1_0_bn (BatchNormal  (None, 4, 4, 2048)  8192        ['conv5_block1_0_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block1_3_bn (BatchNormal  (None, 4, 4, 2048)  8192        ['conv5_block1_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block1_add (Add)         (None, 4, 4, 2048)   0           ['conv5_block1_0_bn[0][0]',      
                                                                  'conv5_block1_3_bn[0][0]']      
                                                                                                  
 conv5_block1_out (Activation)  (None, 4, 4, 2048)   0           ['conv5_block1_add[0][0]']       
                                                                                                  
 conv5_block2_1_conv (Conv2D)   (None, 4, 4, 512)    1049088     ['conv5_block1_out[0][0]']       
                                                                                                  
 conv5_block2_1_bn (BatchNormal  (None, 4, 4, 512)   2048        ['conv5_block2_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block2_1_relu (Activatio  (None, 4, 4, 512)   0           ['conv5_block2_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv5_block2_2_conv (Conv2D)   (None, 4, 4, 512)    2359808     ['conv5_block2_1_relu[0][0]']    
                                                                                                  
 conv5_block2_2_bn (BatchNormal  (None, 4, 4, 512)   2048        ['conv5_block2_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block2_2_relu (Activatio  (None, 4, 4, 512)   0           ['conv5_block2_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv5_block2_3_conv (Conv2D)   (None, 4, 4, 2048)   1050624     ['conv5_block2_2_relu[0][0]']    
                                                                                                  
 conv5_block2_3_bn (BatchNormal  (None, 4, 4, 2048)  8192        ['conv5_block2_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block2_add (Add)         (None, 4, 4, 2048)   0           ['conv5_block1_out[0][0]',       
                                                                  'conv5_block2_3_bn[0][0]']      
                                                                                                  
 conv5_block2_out (Activation)  (None, 4, 4, 2048)   0           ['conv5_block2_add[0][0]']       
                                                                                                  
 conv5_block3_1_conv (Conv2D)   (None, 4, 4, 512)    1049088     ['conv5_block2_out[0][0]']       
                                                                                                  
 conv5_block3_1_bn (BatchNormal  (None, 4, 4, 512)   2048        ['conv5_block3_1_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block3_1_relu (Activatio  (None, 4, 4, 512)   0           ['conv5_block3_1_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv5_block3_2_conv (Conv2D)   (None, 4, 4, 512)    2359808     ['conv5_block3_1_relu[0][0]']    
                                                                                                  
 conv5_block3_2_bn (BatchNormal  (None, 4, 4, 512)   2048        ['conv5_block3_2_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block3_2_relu (Activatio  (None, 4, 4, 512)   0           ['conv5_block3_2_bn[0][0]']      
 n)                                                                                               
                                                                                                  
 conv5_block3_3_conv (Conv2D)   (None, 4, 4, 2048)   1050624     ['conv5_block3_2_relu[0][0]']    
                                                                                                  
 conv5_block3_3_bn (BatchNormal  (None, 4, 4, 2048)  8192        ['conv5_block3_3_conv[0][0]']    
 ization)                                                                                         
                                                                                                  
 conv5_block3_add (Add)         (None, 4, 4, 2048)   0           ['conv5_block2_out[0][0]',       
                                                                  'conv5_block3_3_bn[0][0]']      
                                                                                                  
 conv5_block3_out (Activation)  (None, 4, 4, 2048)   0           ['conv5_block3_add[0][0]']       
                                                                                                  
 avg_pool (GlobalAveragePooling  (None, 2048)        0           ['conv5_block3_out[0][0]']       
 2D)                                                                                              
                                                                                                  
==================================================================================================
Total params: 23,581,440
Trainable params: 23,528,320
Non-trainable params: 53,120
__________________________________________________________________________________________________

How are we gonna to modify it to suit our project??¶

  • Reducing the amount of filters :
    • A regular Resnet50 has around 23 million trainable parameters, by reducing the filters, we can have a trainable model that does not take up too much time
  • Normalizing our inputs :
    • This helps our model converge faster and help it to generalise better
  • Network Depth :
    • For the 31x31 input size, a 12-layered ResNet will be implemented, and for the 128x128 input size, a 16-layered ResNet will be used. As we require deeper models for capture more complex features in 128x128
  • Including dropout layer:
    • To further combat overfitting, a dropout layer will be incorporated.
  • L2 regularization:
    • L2 regularization will be applied to the network's weights. This regularization technique adds a penalty term to the loss function, discouraging large weight values.
In [ ]:
def identity_block(X, f, filters):
    F1, F2, F3 = filters

    X_shortcut = X

    X = Conv2D(filters=F1, kernel_size=(1, 1), strides=(1, 1), padding='valid')(X)
    X = BatchNormalization(axis=3)(X)
    X = Activation('relu')(X)

    X = Conv2D(filters=F2, kernel_size=(f, f), strides=(1, 1), padding='same')(X)
    X = BatchNormalization(axis=3)(X)
    X = Activation('relu')(X)

    X = Conv2D(filters=F3, kernel_size=(1, 1), strides=(1, 1), padding='valid')(X)
    X = BatchNormalization(axis=3)(X)

    X = Add()([X, X_shortcut])
    X = Activation('relu')(X)

    return X

def projection_block(X, f, filters, s=2):
    F1, F2, F3 = filters

    X_shortcut = X

    X = Conv2D(F1, (1, 1), strides=(s, s))(X)
    X = BatchNormalization(axis=3)(X)
    X = Activation('relu')(X)

    X = Conv2D(F2, (f, f), strides=(1, 1), padding='same')(X)
    X = BatchNormalization(axis=3)(X)
    X = Activation('relu')(X)

    X = Conv2D(F3, (1, 1), strides=(1, 1), padding='valid')(X)
    X = BatchNormalization(axis=3)(X)

    X_shortcut = Conv2D(F3, (1, 1), strides=(s, s))(X_shortcut)
    X_shortcut = BatchNormalization(axis=3)(X_shortcut)

    X = Add()([X, X_shortcut])
    X = Activation('relu')(X)
    return X
In [ ]:
def CustomResnet(input_shape, classes=15):
    tf.keras.backend.clear_session()
    X_input = Input(input_shape)

    # Stage 1
    X = Conv2D(64, (7, 7), strides=(2, 2), padding='same')(X_input)
    X = BatchNormalization(axis=3)(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((3, 3), strides=(2, 2))(X)

    if input_shape == (31, 31, 1):
        stages = [
            {'blocks': 3, 'filters': [8, 8, 32]},
            {'blocks': 3, 'filters': [16, 16, 64]},
            {'blocks': 3, 'filters': [32, 32, 128]},
            {'blocks': 3, 'filters': [64, 64, 256]}
        ]
    elif input_shape == (128, 128, 1):
        stages = [
            {'blocks': 4, 'filters': [8, 8, 32]},
            {'blocks': 4, 'filters': [16, 16, 64]},
            {'blocks': 4, 'filters': [32, 32, 128]},
            {'blocks': 4, 'filters': [64, 64, 256]}
        ]
    for i, stage in enumerate(stages):
        X = projection_block(X, f=3, filters=stage['filters'], s=1 if i == 0 else 2)
        for _ in range(stage['blocks']):
            X = identity_block(X, 3, stage['filters'])

    X = AveragePooling2D(pool_size=(2, 2), padding='same')(X)
    X = Flatten()(X)
    X = Dense(256, activation='relu',kernel_regularizer=l2(weight_decay))(X)
    X = Dense(256, activation='relu',kernel_regularizer=l2(weight_decay))(X)
    X = Dropout(0.2)(X)
    X = Dense(classes, activation='softmax')(X)

    model = Model(inputs=X_input, outputs=X, name='ResNet50')

    return model


CustomResnet_128 = CustomResnet(input_shape=(128, 128, 1), classes=15)
CustomResnet_31 = CustomResnet(input_shape=(31, 31, 1), classes=15)

CustomResnet_128.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
CustomResnet_31.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
In [ ]:
CustomResnet_128.summary()
Model: "ResNet50"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_1 (InputLayer)           [(None, 128, 128, 1  0           []                               
                                )]                                                                
                                                                                                  
 conv2d (Conv2D)                (None, 64, 64, 64)   3200        ['input_1[0][0]']                
                                                                                                  
 batch_normalization (BatchNorm  (None, 64, 64, 64)  256         ['conv2d[0][0]']                 
 alization)                                                                                       
                                                                                                  
 activation (Activation)        (None, 64, 64, 64)   0           ['batch_normalization[0][0]']    
                                                                                                  
 max_pooling2d (MaxPooling2D)   (None, 31, 31, 64)   0           ['activation[0][0]']             
                                                                                                  
 conv2d_1 (Conv2D)              (None, 31, 31, 8)    520         ['max_pooling2d[0][0]']          
                                                                                                  
 batch_normalization_1 (BatchNo  (None, 31, 31, 8)   32          ['conv2d_1[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_1 (Activation)      (None, 31, 31, 8)    0           ['batch_normalization_1[0][0]']  
                                                                                                  
 conv2d_2 (Conv2D)              (None, 31, 31, 8)    584         ['activation_1[0][0]']           
                                                                                                  
 batch_normalization_2 (BatchNo  (None, 31, 31, 8)   32          ['conv2d_2[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_2 (Activation)      (None, 31, 31, 8)    0           ['batch_normalization_2[0][0]']  
                                                                                                  
 conv2d_3 (Conv2D)              (None, 31, 31, 32)   288         ['activation_2[0][0]']           
                                                                                                  
 conv2d_4 (Conv2D)              (None, 31, 31, 32)   2080        ['max_pooling2d[0][0]']          
                                                                                                  
 batch_normalization_3 (BatchNo  (None, 31, 31, 32)  128         ['conv2d_3[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 batch_normalization_4 (BatchNo  (None, 31, 31, 32)  128         ['conv2d_4[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 add (Add)                      (None, 31, 31, 32)   0           ['batch_normalization_3[0][0]',  
                                                                  'batch_normalization_4[0][0]']  
                                                                                                  
 activation_3 (Activation)      (None, 31, 31, 32)   0           ['add[0][0]']                    
                                                                                                  
 conv2d_5 (Conv2D)              (None, 31, 31, 8)    264         ['activation_3[0][0]']           
                                                                                                  
 batch_normalization_5 (BatchNo  (None, 31, 31, 8)   32          ['conv2d_5[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_4 (Activation)      (None, 31, 31, 8)    0           ['batch_normalization_5[0][0]']  
                                                                                                  
 conv2d_6 (Conv2D)              (None, 31, 31, 8)    584         ['activation_4[0][0]']           
                                                                                                  
 batch_normalization_6 (BatchNo  (None, 31, 31, 8)   32          ['conv2d_6[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_5 (Activation)      (None, 31, 31, 8)    0           ['batch_normalization_6[0][0]']  
                                                                                                  
 conv2d_7 (Conv2D)              (None, 31, 31, 32)   288         ['activation_5[0][0]']           
                                                                                                  
 batch_normalization_7 (BatchNo  (None, 31, 31, 32)  128         ['conv2d_7[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 add_1 (Add)                    (None, 31, 31, 32)   0           ['batch_normalization_7[0][0]',  
                                                                  'activation_3[0][0]']           
                                                                                                  
 activation_6 (Activation)      (None, 31, 31, 32)   0           ['add_1[0][0]']                  
                                                                                                  
 conv2d_8 (Conv2D)              (None, 31, 31, 8)    264         ['activation_6[0][0]']           
                                                                                                  
 batch_normalization_8 (BatchNo  (None, 31, 31, 8)   32          ['conv2d_8[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_7 (Activation)      (None, 31, 31, 8)    0           ['batch_normalization_8[0][0]']  
                                                                                                  
 conv2d_9 (Conv2D)              (None, 31, 31, 8)    584         ['activation_7[0][0]']           
                                                                                                  
 batch_normalization_9 (BatchNo  (None, 31, 31, 8)   32          ['conv2d_9[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_8 (Activation)      (None, 31, 31, 8)    0           ['batch_normalization_9[0][0]']  
                                                                                                  
 conv2d_10 (Conv2D)             (None, 31, 31, 32)   288         ['activation_8[0][0]']           
                                                                                                  
 batch_normalization_10 (BatchN  (None, 31, 31, 32)  128         ['conv2d_10[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_2 (Add)                    (None, 31, 31, 32)   0           ['batch_normalization_10[0][0]', 
                                                                  'activation_6[0][0]']           
                                                                                                  
 activation_9 (Activation)      (None, 31, 31, 32)   0           ['add_2[0][0]']                  
                                                                                                  
 conv2d_11 (Conv2D)             (None, 31, 31, 8)    264         ['activation_9[0][0]']           
                                                                                                  
 batch_normalization_11 (BatchN  (None, 31, 31, 8)   32          ['conv2d_11[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_10 (Activation)     (None, 31, 31, 8)    0           ['batch_normalization_11[0][0]'] 
                                                                                                  
 conv2d_12 (Conv2D)             (None, 31, 31, 8)    584         ['activation_10[0][0]']          
                                                                                                  
 batch_normalization_12 (BatchN  (None, 31, 31, 8)   32          ['conv2d_12[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_11 (Activation)     (None, 31, 31, 8)    0           ['batch_normalization_12[0][0]'] 
                                                                                                  
 conv2d_13 (Conv2D)             (None, 31, 31, 32)   288         ['activation_11[0][0]']          
                                                                                                  
 batch_normalization_13 (BatchN  (None, 31, 31, 32)  128         ['conv2d_13[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_3 (Add)                    (None, 31, 31, 32)   0           ['batch_normalization_13[0][0]', 
                                                                  'activation_9[0][0]']           
                                                                                                  
 activation_12 (Activation)     (None, 31, 31, 32)   0           ['add_3[0][0]']                  
                                                                                                  
 conv2d_14 (Conv2D)             (None, 31, 31, 8)    264         ['activation_12[0][0]']          
                                                                                                  
 batch_normalization_14 (BatchN  (None, 31, 31, 8)   32          ['conv2d_14[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_13 (Activation)     (None, 31, 31, 8)    0           ['batch_normalization_14[0][0]'] 
                                                                                                  
 conv2d_15 (Conv2D)             (None, 31, 31, 8)    584         ['activation_13[0][0]']          
                                                                                                  
 batch_normalization_15 (BatchN  (None, 31, 31, 8)   32          ['conv2d_15[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_14 (Activation)     (None, 31, 31, 8)    0           ['batch_normalization_15[0][0]'] 
                                                                                                  
 conv2d_16 (Conv2D)             (None, 31, 31, 32)   288         ['activation_14[0][0]']          
                                                                                                  
 batch_normalization_16 (BatchN  (None, 31, 31, 32)  128         ['conv2d_16[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_4 (Add)                    (None, 31, 31, 32)   0           ['batch_normalization_16[0][0]', 
                                                                  'activation_12[0][0]']          
                                                                                                  
 activation_15 (Activation)     (None, 31, 31, 32)   0           ['add_4[0][0]']                  
                                                                                                  
 conv2d_17 (Conv2D)             (None, 16, 16, 16)   528         ['activation_15[0][0]']          
                                                                                                  
 batch_normalization_17 (BatchN  (None, 16, 16, 16)  64          ['conv2d_17[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_16 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_17[0][0]'] 
                                                                                                  
 conv2d_18 (Conv2D)             (None, 16, 16, 16)   2320        ['activation_16[0][0]']          
                                                                                                  
 batch_normalization_18 (BatchN  (None, 16, 16, 16)  64          ['conv2d_18[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_17 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_18[0][0]'] 
                                                                                                  
 conv2d_19 (Conv2D)             (None, 16, 16, 64)   1088        ['activation_17[0][0]']          
                                                                                                  
 conv2d_20 (Conv2D)             (None, 16, 16, 64)   2112        ['activation_15[0][0]']          
                                                                                                  
 batch_normalization_19 (BatchN  (None, 16, 16, 64)  256         ['conv2d_19[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 batch_normalization_20 (BatchN  (None, 16, 16, 64)  256         ['conv2d_20[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_5 (Add)                    (None, 16, 16, 64)   0           ['batch_normalization_19[0][0]', 
                                                                  'batch_normalization_20[0][0]'] 
                                                                                                  
 activation_18 (Activation)     (None, 16, 16, 64)   0           ['add_5[0][0]']                  
                                                                                                  
 conv2d_21 (Conv2D)             (None, 16, 16, 16)   1040        ['activation_18[0][0]']          
                                                                                                  
 batch_normalization_21 (BatchN  (None, 16, 16, 16)  64          ['conv2d_21[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_19 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_21[0][0]'] 
                                                                                                  
 conv2d_22 (Conv2D)             (None, 16, 16, 16)   2320        ['activation_19[0][0]']          
                                                                                                  
 batch_normalization_22 (BatchN  (None, 16, 16, 16)  64          ['conv2d_22[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_20 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_22[0][0]'] 
                                                                                                  
 conv2d_23 (Conv2D)             (None, 16, 16, 64)   1088        ['activation_20[0][0]']          
                                                                                                  
 batch_normalization_23 (BatchN  (None, 16, 16, 64)  256         ['conv2d_23[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_6 (Add)                    (None, 16, 16, 64)   0           ['batch_normalization_23[0][0]', 
                                                                  'activation_18[0][0]']          
                                                                                                  
 activation_21 (Activation)     (None, 16, 16, 64)   0           ['add_6[0][0]']                  
                                                                                                  
 conv2d_24 (Conv2D)             (None, 16, 16, 16)   1040        ['activation_21[0][0]']          
                                                                                                  
 batch_normalization_24 (BatchN  (None, 16, 16, 16)  64          ['conv2d_24[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_22 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_24[0][0]'] 
                                                                                                  
 conv2d_25 (Conv2D)             (None, 16, 16, 16)   2320        ['activation_22[0][0]']          
                                                                                                  
 batch_normalization_25 (BatchN  (None, 16, 16, 16)  64          ['conv2d_25[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_23 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_25[0][0]'] 
                                                                                                  
 conv2d_26 (Conv2D)             (None, 16, 16, 64)   1088        ['activation_23[0][0]']          
                                                                                                  
 batch_normalization_26 (BatchN  (None, 16, 16, 64)  256         ['conv2d_26[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_7 (Add)                    (None, 16, 16, 64)   0           ['batch_normalization_26[0][0]', 
                                                                  'activation_21[0][0]']          
                                                                                                  
 activation_24 (Activation)     (None, 16, 16, 64)   0           ['add_7[0][0]']                  
                                                                                                  
 conv2d_27 (Conv2D)             (None, 16, 16, 16)   1040        ['activation_24[0][0]']          
                                                                                                  
 batch_normalization_27 (BatchN  (None, 16, 16, 16)  64          ['conv2d_27[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_25 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_27[0][0]'] 
                                                                                                  
 conv2d_28 (Conv2D)             (None, 16, 16, 16)   2320        ['activation_25[0][0]']          
                                                                                                  
 batch_normalization_28 (BatchN  (None, 16, 16, 16)  64          ['conv2d_28[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_26 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_28[0][0]'] 
                                                                                                  
 conv2d_29 (Conv2D)             (None, 16, 16, 64)   1088        ['activation_26[0][0]']          
                                                                                                  
 batch_normalization_29 (BatchN  (None, 16, 16, 64)  256         ['conv2d_29[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_8 (Add)                    (None, 16, 16, 64)   0           ['batch_normalization_29[0][0]', 
                                                                  'activation_24[0][0]']          
                                                                                                  
 activation_27 (Activation)     (None, 16, 16, 64)   0           ['add_8[0][0]']                  
                                                                                                  
 conv2d_30 (Conv2D)             (None, 16, 16, 16)   1040        ['activation_27[0][0]']          
                                                                                                  
 batch_normalization_30 (BatchN  (None, 16, 16, 16)  64          ['conv2d_30[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_28 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_30[0][0]'] 
                                                                                                  
 conv2d_31 (Conv2D)             (None, 16, 16, 16)   2320        ['activation_28[0][0]']          
                                                                                                  
 batch_normalization_31 (BatchN  (None, 16, 16, 16)  64          ['conv2d_31[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_29 (Activation)     (None, 16, 16, 16)   0           ['batch_normalization_31[0][0]'] 
                                                                                                  
 conv2d_32 (Conv2D)             (None, 16, 16, 64)   1088        ['activation_29[0][0]']          
                                                                                                  
 batch_normalization_32 (BatchN  (None, 16, 16, 64)  256         ['conv2d_32[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_9 (Add)                    (None, 16, 16, 64)   0           ['batch_normalization_32[0][0]', 
                                                                  'activation_27[0][0]']          
                                                                                                  
 activation_30 (Activation)     (None, 16, 16, 64)   0           ['add_9[0][0]']                  
                                                                                                  
 conv2d_33 (Conv2D)             (None, 8, 8, 32)     2080        ['activation_30[0][0]']          
                                                                                                  
 batch_normalization_33 (BatchN  (None, 8, 8, 32)    128         ['conv2d_33[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_31 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_33[0][0]'] 
                                                                                                  
 conv2d_34 (Conv2D)             (None, 8, 8, 32)     9248        ['activation_31[0][0]']          
                                                                                                  
 batch_normalization_34 (BatchN  (None, 8, 8, 32)    128         ['conv2d_34[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_32 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_34[0][0]'] 
                                                                                                  
 conv2d_35 (Conv2D)             (None, 8, 8, 128)    4224        ['activation_32[0][0]']          
                                                                                                  
 conv2d_36 (Conv2D)             (None, 8, 8, 128)    8320        ['activation_30[0][0]']          
                                                                                                  
 batch_normalization_35 (BatchN  (None, 8, 8, 128)   512         ['conv2d_35[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 batch_normalization_36 (BatchN  (None, 8, 8, 128)   512         ['conv2d_36[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_10 (Add)                   (None, 8, 8, 128)    0           ['batch_normalization_35[0][0]', 
                                                                  'batch_normalization_36[0][0]'] 
                                                                                                  
 activation_33 (Activation)     (None, 8, 8, 128)    0           ['add_10[0][0]']                 
                                                                                                  
 conv2d_37 (Conv2D)             (None, 8, 8, 32)     4128        ['activation_33[0][0]']          
                                                                                                  
 batch_normalization_37 (BatchN  (None, 8, 8, 32)    128         ['conv2d_37[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_34 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_37[0][0]'] 
                                                                                                  
 conv2d_38 (Conv2D)             (None, 8, 8, 32)     9248        ['activation_34[0][0]']          
                                                                                                  
 batch_normalization_38 (BatchN  (None, 8, 8, 32)    128         ['conv2d_38[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_35 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_38[0][0]'] 
                                                                                                  
 conv2d_39 (Conv2D)             (None, 8, 8, 128)    4224        ['activation_35[0][0]']          
                                                                                                  
 batch_normalization_39 (BatchN  (None, 8, 8, 128)   512         ['conv2d_39[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_11 (Add)                   (None, 8, 8, 128)    0           ['batch_normalization_39[0][0]', 
                                                                  'activation_33[0][0]']          
                                                                                                  
 activation_36 (Activation)     (None, 8, 8, 128)    0           ['add_11[0][0]']                 
                                                                                                  
 conv2d_40 (Conv2D)             (None, 8, 8, 32)     4128        ['activation_36[0][0]']          
                                                                                                  
 batch_normalization_40 (BatchN  (None, 8, 8, 32)    128         ['conv2d_40[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_37 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_40[0][0]'] 
                                                                                                  
 conv2d_41 (Conv2D)             (None, 8, 8, 32)     9248        ['activation_37[0][0]']          
                                                                                                  
 batch_normalization_41 (BatchN  (None, 8, 8, 32)    128         ['conv2d_41[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_38 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_41[0][0]'] 
                                                                                                  
 conv2d_42 (Conv2D)             (None, 8, 8, 128)    4224        ['activation_38[0][0]']          
                                                                                                  
 batch_normalization_42 (BatchN  (None, 8, 8, 128)   512         ['conv2d_42[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_12 (Add)                   (None, 8, 8, 128)    0           ['batch_normalization_42[0][0]', 
                                                                  'activation_36[0][0]']          
                                                                                                  
 activation_39 (Activation)     (None, 8, 8, 128)    0           ['add_12[0][0]']                 
                                                                                                  
 conv2d_43 (Conv2D)             (None, 8, 8, 32)     4128        ['activation_39[0][0]']          
                                                                                                  
 batch_normalization_43 (BatchN  (None, 8, 8, 32)    128         ['conv2d_43[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_40 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_43[0][0]'] 
                                                                                                  
 conv2d_44 (Conv2D)             (None, 8, 8, 32)     9248        ['activation_40[0][0]']          
                                                                                                  
 batch_normalization_44 (BatchN  (None, 8, 8, 32)    128         ['conv2d_44[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_41 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_44[0][0]'] 
                                                                                                  
 conv2d_45 (Conv2D)             (None, 8, 8, 128)    4224        ['activation_41[0][0]']          
                                                                                                  
 batch_normalization_45 (BatchN  (None, 8, 8, 128)   512         ['conv2d_45[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_13 (Add)                   (None, 8, 8, 128)    0           ['batch_normalization_45[0][0]', 
                                                                  'activation_39[0][0]']          
                                                                                                  
 activation_42 (Activation)     (None, 8, 8, 128)    0           ['add_13[0][0]']                 
                                                                                                  
 conv2d_46 (Conv2D)             (None, 8, 8, 32)     4128        ['activation_42[0][0]']          
                                                                                                  
 batch_normalization_46 (BatchN  (None, 8, 8, 32)    128         ['conv2d_46[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_43 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_46[0][0]'] 
                                                                                                  
 conv2d_47 (Conv2D)             (None, 8, 8, 32)     9248        ['activation_43[0][0]']          
                                                                                                  
 batch_normalization_47 (BatchN  (None, 8, 8, 32)    128         ['conv2d_47[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_44 (Activation)     (None, 8, 8, 32)     0           ['batch_normalization_47[0][0]'] 
                                                                                                  
 conv2d_48 (Conv2D)             (None, 8, 8, 128)    4224        ['activation_44[0][0]']          
                                                                                                  
 batch_normalization_48 (BatchN  (None, 8, 8, 128)   512         ['conv2d_48[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_14 (Add)                   (None, 8, 8, 128)    0           ['batch_normalization_48[0][0]', 
                                                                  'activation_42[0][0]']          
                                                                                                  
 activation_45 (Activation)     (None, 8, 8, 128)    0           ['add_14[0][0]']                 
                                                                                                  
 conv2d_49 (Conv2D)             (None, 4, 4, 64)     8256        ['activation_45[0][0]']          
                                                                                                  
 batch_normalization_49 (BatchN  (None, 4, 4, 64)    256         ['conv2d_49[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_46 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_49[0][0]'] 
                                                                                                  
 conv2d_50 (Conv2D)             (None, 4, 4, 64)     36928       ['activation_46[0][0]']          
                                                                                                  
 batch_normalization_50 (BatchN  (None, 4, 4, 64)    256         ['conv2d_50[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_47 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_50[0][0]'] 
                                                                                                  
 conv2d_51 (Conv2D)             (None, 4, 4, 256)    16640       ['activation_47[0][0]']          
                                                                                                  
 conv2d_52 (Conv2D)             (None, 4, 4, 256)    33024       ['activation_45[0][0]']          
                                                                                                  
 batch_normalization_51 (BatchN  (None, 4, 4, 256)   1024        ['conv2d_51[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 batch_normalization_52 (BatchN  (None, 4, 4, 256)   1024        ['conv2d_52[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_15 (Add)                   (None, 4, 4, 256)    0           ['batch_normalization_51[0][0]', 
                                                                  'batch_normalization_52[0][0]'] 
                                                                                                  
 activation_48 (Activation)     (None, 4, 4, 256)    0           ['add_15[0][0]']                 
                                                                                                  
 conv2d_53 (Conv2D)             (None, 4, 4, 64)     16448       ['activation_48[0][0]']          
                                                                                                  
 batch_normalization_53 (BatchN  (None, 4, 4, 64)    256         ['conv2d_53[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_49 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_53[0][0]'] 
                                                                                                  
 conv2d_54 (Conv2D)             (None, 4, 4, 64)     36928       ['activation_49[0][0]']          
                                                                                                  
 batch_normalization_54 (BatchN  (None, 4, 4, 64)    256         ['conv2d_54[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_50 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_54[0][0]'] 
                                                                                                  
 conv2d_55 (Conv2D)             (None, 4, 4, 256)    16640       ['activation_50[0][0]']          
                                                                                                  
 batch_normalization_55 (BatchN  (None, 4, 4, 256)   1024        ['conv2d_55[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_16 (Add)                   (None, 4, 4, 256)    0           ['batch_normalization_55[0][0]', 
                                                                  'activation_48[0][0]']          
                                                                                                  
 activation_51 (Activation)     (None, 4, 4, 256)    0           ['add_16[0][0]']                 
                                                                                                  
 conv2d_56 (Conv2D)             (None, 4, 4, 64)     16448       ['activation_51[0][0]']          
                                                                                                  
 batch_normalization_56 (BatchN  (None, 4, 4, 64)    256         ['conv2d_56[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_52 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_56[0][0]'] 
                                                                                                  
 conv2d_57 (Conv2D)             (None, 4, 4, 64)     36928       ['activation_52[0][0]']          
                                                                                                  
 batch_normalization_57 (BatchN  (None, 4, 4, 64)    256         ['conv2d_57[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_53 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_57[0][0]'] 
                                                                                                  
 conv2d_58 (Conv2D)             (None, 4, 4, 256)    16640       ['activation_53[0][0]']          
                                                                                                  
 batch_normalization_58 (BatchN  (None, 4, 4, 256)   1024        ['conv2d_58[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_17 (Add)                   (None, 4, 4, 256)    0           ['batch_normalization_58[0][0]', 
                                                                  'activation_51[0][0]']          
                                                                                                  
 activation_54 (Activation)     (None, 4, 4, 256)    0           ['add_17[0][0]']                 
                                                                                                  
 conv2d_59 (Conv2D)             (None, 4, 4, 64)     16448       ['activation_54[0][0]']          
                                                                                                  
 batch_normalization_59 (BatchN  (None, 4, 4, 64)    256         ['conv2d_59[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_55 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_59[0][0]'] 
                                                                                                  
 conv2d_60 (Conv2D)             (None, 4, 4, 64)     36928       ['activation_55[0][0]']          
                                                                                                  
 batch_normalization_60 (BatchN  (None, 4, 4, 64)    256         ['conv2d_60[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_56 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_60[0][0]'] 
                                                                                                  
 conv2d_61 (Conv2D)             (None, 4, 4, 256)    16640       ['activation_56[0][0]']          
                                                                                                  
 batch_normalization_61 (BatchN  (None, 4, 4, 256)   1024        ['conv2d_61[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_18 (Add)                   (None, 4, 4, 256)    0           ['batch_normalization_61[0][0]', 
                                                                  'activation_54[0][0]']          
                                                                                                  
 activation_57 (Activation)     (None, 4, 4, 256)    0           ['add_18[0][0]']                 
                                                                                                  
 conv2d_62 (Conv2D)             (None, 4, 4, 64)     16448       ['activation_57[0][0]']          
                                                                                                  
 batch_normalization_62 (BatchN  (None, 4, 4, 64)    256         ['conv2d_62[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_58 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_62[0][0]'] 
                                                                                                  
 conv2d_63 (Conv2D)             (None, 4, 4, 64)     36928       ['activation_58[0][0]']          
                                                                                                  
 batch_normalization_63 (BatchN  (None, 4, 4, 64)    256         ['conv2d_63[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_59 (Activation)     (None, 4, 4, 64)     0           ['batch_normalization_63[0][0]'] 
                                                                                                  
 conv2d_64 (Conv2D)             (None, 4, 4, 256)    16640       ['activation_59[0][0]']          
                                                                                                  
 batch_normalization_64 (BatchN  (None, 4, 4, 256)   1024        ['conv2d_64[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_19 (Add)                   (None, 4, 4, 256)    0           ['batch_normalization_64[0][0]', 
                                                                  'activation_57[0][0]']          
                                                                                                  
 activation_60 (Activation)     (None, 4, 4, 256)    0           ['add_19[0][0]']                 
                                                                                                  
 average_pooling2d (AveragePool  (None, 2, 2, 256)   0           ['activation_60[0][0]']          
 ing2D)                                                                                           
                                                                                                  
 flatten (Flatten)              (None, 1024)         0           ['average_pooling2d[0][0]']      
                                                                                                  
 dense (Dense)                  (None, 256)          262400      ['flatten[0][0]']                
                                                                                                  
 dense_1 (Dense)                (None, 256)          65792       ['dense[0][0]']                  
                                                                                                  
 dropout (Dropout)              (None, 256)          0           ['dense_1[0][0]']                
                                                                                                  
 dense_2 (Dense)                (None, 15)           3855        ['dropout[0][0]']                
                                                                                                  
==================================================================================================
Total params: 852,863
Trainable params: 844,575
Non-trainable params: 8,288
__________________________________________________________________________________________________
In [ ]:
CustomResnet_31.summary()
Model: "ResNet50"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_1 (InputLayer)           [(None, 31, 31, 1)]  0           []                               
                                                                                                  
 conv2d (Conv2D)                (None, 16, 16, 64)   3200        ['input_1[0][0]']                
                                                                                                  
 batch_normalization (BatchNorm  (None, 16, 16, 64)  256         ['conv2d[0][0]']                 
 alization)                                                                                       
                                                                                                  
 activation (Activation)        (None, 16, 16, 64)   0           ['batch_normalization[0][0]']    
                                                                                                  
 max_pooling2d (MaxPooling2D)   (None, 7, 7, 64)     0           ['activation[0][0]']             
                                                                                                  
 conv2d_1 (Conv2D)              (None, 7, 7, 8)      520         ['max_pooling2d[0][0]']          
                                                                                                  
 batch_normalization_1 (BatchNo  (None, 7, 7, 8)     32          ['conv2d_1[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_1 (Activation)      (None, 7, 7, 8)      0           ['batch_normalization_1[0][0]']  
                                                                                                  
 conv2d_2 (Conv2D)              (None, 7, 7, 8)      584         ['activation_1[0][0]']           
                                                                                                  
 batch_normalization_2 (BatchNo  (None, 7, 7, 8)     32          ['conv2d_2[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_2 (Activation)      (None, 7, 7, 8)      0           ['batch_normalization_2[0][0]']  
                                                                                                  
 conv2d_3 (Conv2D)              (None, 7, 7, 32)     288         ['activation_2[0][0]']           
                                                                                                  
 conv2d_4 (Conv2D)              (None, 7, 7, 32)     2080        ['max_pooling2d[0][0]']          
                                                                                                  
 batch_normalization_3 (BatchNo  (None, 7, 7, 32)    128         ['conv2d_3[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 batch_normalization_4 (BatchNo  (None, 7, 7, 32)    128         ['conv2d_4[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 add (Add)                      (None, 7, 7, 32)     0           ['batch_normalization_3[0][0]',  
                                                                  'batch_normalization_4[0][0]']  
                                                                                                  
 activation_3 (Activation)      (None, 7, 7, 32)     0           ['add[0][0]']                    
                                                                                                  
 conv2d_5 (Conv2D)              (None, 7, 7, 8)      264         ['activation_3[0][0]']           
                                                                                                  
 batch_normalization_5 (BatchNo  (None, 7, 7, 8)     32          ['conv2d_5[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_4 (Activation)      (None, 7, 7, 8)      0           ['batch_normalization_5[0][0]']  
                                                                                                  
 conv2d_6 (Conv2D)              (None, 7, 7, 8)      584         ['activation_4[0][0]']           
                                                                                                  
 batch_normalization_6 (BatchNo  (None, 7, 7, 8)     32          ['conv2d_6[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_5 (Activation)      (None, 7, 7, 8)      0           ['batch_normalization_6[0][0]']  
                                                                                                  
 conv2d_7 (Conv2D)              (None, 7, 7, 32)     288         ['activation_5[0][0]']           
                                                                                                  
 batch_normalization_7 (BatchNo  (None, 7, 7, 32)    128         ['conv2d_7[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 add_1 (Add)                    (None, 7, 7, 32)     0           ['batch_normalization_7[0][0]',  
                                                                  'activation_3[0][0]']           
                                                                                                  
 activation_6 (Activation)      (None, 7, 7, 32)     0           ['add_1[0][0]']                  
                                                                                                  
 conv2d_8 (Conv2D)              (None, 7, 7, 8)      264         ['activation_6[0][0]']           
                                                                                                  
 batch_normalization_8 (BatchNo  (None, 7, 7, 8)     32          ['conv2d_8[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_7 (Activation)      (None, 7, 7, 8)      0           ['batch_normalization_8[0][0]']  
                                                                                                  
 conv2d_9 (Conv2D)              (None, 7, 7, 8)      584         ['activation_7[0][0]']           
                                                                                                  
 batch_normalization_9 (BatchNo  (None, 7, 7, 8)     32          ['conv2d_9[0][0]']               
 rmalization)                                                                                     
                                                                                                  
 activation_8 (Activation)      (None, 7, 7, 8)      0           ['batch_normalization_9[0][0]']  
                                                                                                  
 conv2d_10 (Conv2D)             (None, 7, 7, 32)     288         ['activation_8[0][0]']           
                                                                                                  
 batch_normalization_10 (BatchN  (None, 7, 7, 32)    128         ['conv2d_10[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_2 (Add)                    (None, 7, 7, 32)     0           ['batch_normalization_10[0][0]', 
                                                                  'activation_6[0][0]']           
                                                                                                  
 activation_9 (Activation)      (None, 7, 7, 32)     0           ['add_2[0][0]']                  
                                                                                                  
 conv2d_11 (Conv2D)             (None, 7, 7, 8)      264         ['activation_9[0][0]']           
                                                                                                  
 batch_normalization_11 (BatchN  (None, 7, 7, 8)     32          ['conv2d_11[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_10 (Activation)     (None, 7, 7, 8)      0           ['batch_normalization_11[0][0]'] 
                                                                                                  
 conv2d_12 (Conv2D)             (None, 7, 7, 8)      584         ['activation_10[0][0]']          
                                                                                                  
 batch_normalization_12 (BatchN  (None, 7, 7, 8)     32          ['conv2d_12[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_11 (Activation)     (None, 7, 7, 8)      0           ['batch_normalization_12[0][0]'] 
                                                                                                  
 conv2d_13 (Conv2D)             (None, 7, 7, 32)     288         ['activation_11[0][0]']          
                                                                                                  
 batch_normalization_13 (BatchN  (None, 7, 7, 32)    128         ['conv2d_13[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_3 (Add)                    (None, 7, 7, 32)     0           ['batch_normalization_13[0][0]', 
                                                                  'activation_9[0][0]']           
                                                                                                  
 activation_12 (Activation)     (None, 7, 7, 32)     0           ['add_3[0][0]']                  
                                                                                                  
 conv2d_14 (Conv2D)             (None, 4, 4, 16)     528         ['activation_12[0][0]']          
                                                                                                  
 batch_normalization_14 (BatchN  (None, 4, 4, 16)    64          ['conv2d_14[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_13 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_14[0][0]'] 
                                                                                                  
 conv2d_15 (Conv2D)             (None, 4, 4, 16)     2320        ['activation_13[0][0]']          
                                                                                                  
 batch_normalization_15 (BatchN  (None, 4, 4, 16)    64          ['conv2d_15[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_14 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_15[0][0]'] 
                                                                                                  
 conv2d_16 (Conv2D)             (None, 4, 4, 64)     1088        ['activation_14[0][0]']          
                                                                                                  
 conv2d_17 (Conv2D)             (None, 4, 4, 64)     2112        ['activation_12[0][0]']          
                                                                                                  
 batch_normalization_16 (BatchN  (None, 4, 4, 64)    256         ['conv2d_16[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 batch_normalization_17 (BatchN  (None, 4, 4, 64)    256         ['conv2d_17[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_4 (Add)                    (None, 4, 4, 64)     0           ['batch_normalization_16[0][0]', 
                                                                  'batch_normalization_17[0][0]'] 
                                                                                                  
 activation_15 (Activation)     (None, 4, 4, 64)     0           ['add_4[0][0]']                  
                                                                                                  
 conv2d_18 (Conv2D)             (None, 4, 4, 16)     1040        ['activation_15[0][0]']          
                                                                                                  
 batch_normalization_18 (BatchN  (None, 4, 4, 16)    64          ['conv2d_18[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_16 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_18[0][0]'] 
                                                                                                  
 conv2d_19 (Conv2D)             (None, 4, 4, 16)     2320        ['activation_16[0][0]']          
                                                                                                  
 batch_normalization_19 (BatchN  (None, 4, 4, 16)    64          ['conv2d_19[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_17 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_19[0][0]'] 
                                                                                                  
 conv2d_20 (Conv2D)             (None, 4, 4, 64)     1088        ['activation_17[0][0]']          
                                                                                                  
 batch_normalization_20 (BatchN  (None, 4, 4, 64)    256         ['conv2d_20[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_5 (Add)                    (None, 4, 4, 64)     0           ['batch_normalization_20[0][0]', 
                                                                  'activation_15[0][0]']          
                                                                                                  
 activation_18 (Activation)     (None, 4, 4, 64)     0           ['add_5[0][0]']                  
                                                                                                  
 conv2d_21 (Conv2D)             (None, 4, 4, 16)     1040        ['activation_18[0][0]']          
                                                                                                  
 batch_normalization_21 (BatchN  (None, 4, 4, 16)    64          ['conv2d_21[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_19 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_21[0][0]'] 
                                                                                                  
 conv2d_22 (Conv2D)             (None, 4, 4, 16)     2320        ['activation_19[0][0]']          
                                                                                                  
 batch_normalization_22 (BatchN  (None, 4, 4, 16)    64          ['conv2d_22[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_20 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_22[0][0]'] 
                                                                                                  
 conv2d_23 (Conv2D)             (None, 4, 4, 64)     1088        ['activation_20[0][0]']          
                                                                                                  
 batch_normalization_23 (BatchN  (None, 4, 4, 64)    256         ['conv2d_23[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_6 (Add)                    (None, 4, 4, 64)     0           ['batch_normalization_23[0][0]', 
                                                                  'activation_18[0][0]']          
                                                                                                  
 activation_21 (Activation)     (None, 4, 4, 64)     0           ['add_6[0][0]']                  
                                                                                                  
 conv2d_24 (Conv2D)             (None, 4, 4, 16)     1040        ['activation_21[0][0]']          
                                                                                                  
 batch_normalization_24 (BatchN  (None, 4, 4, 16)    64          ['conv2d_24[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_22 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_24[0][0]'] 
                                                                                                  
 conv2d_25 (Conv2D)             (None, 4, 4, 16)     2320        ['activation_22[0][0]']          
                                                                                                  
 batch_normalization_25 (BatchN  (None, 4, 4, 16)    64          ['conv2d_25[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_23 (Activation)     (None, 4, 4, 16)     0           ['batch_normalization_25[0][0]'] 
                                                                                                  
 conv2d_26 (Conv2D)             (None, 4, 4, 64)     1088        ['activation_23[0][0]']          
                                                                                                  
 batch_normalization_26 (BatchN  (None, 4, 4, 64)    256         ['conv2d_26[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_7 (Add)                    (None, 4, 4, 64)     0           ['batch_normalization_26[0][0]', 
                                                                  'activation_21[0][0]']          
                                                                                                  
 activation_24 (Activation)     (None, 4, 4, 64)     0           ['add_7[0][0]']                  
                                                                                                  
 conv2d_27 (Conv2D)             (None, 2, 2, 32)     2080        ['activation_24[0][0]']          
                                                                                                  
 batch_normalization_27 (BatchN  (None, 2, 2, 32)    128         ['conv2d_27[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_25 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_27[0][0]'] 
                                                                                                  
 conv2d_28 (Conv2D)             (None, 2, 2, 32)     9248        ['activation_25[0][0]']          
                                                                                                  
 batch_normalization_28 (BatchN  (None, 2, 2, 32)    128         ['conv2d_28[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_26 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_28[0][0]'] 
                                                                                                  
 conv2d_29 (Conv2D)             (None, 2, 2, 128)    4224        ['activation_26[0][0]']          
                                                                                                  
 conv2d_30 (Conv2D)             (None, 2, 2, 128)    8320        ['activation_24[0][0]']          
                                                                                                  
 batch_normalization_29 (BatchN  (None, 2, 2, 128)   512         ['conv2d_29[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 batch_normalization_30 (BatchN  (None, 2, 2, 128)   512         ['conv2d_30[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_8 (Add)                    (None, 2, 2, 128)    0           ['batch_normalization_29[0][0]', 
                                                                  'batch_normalization_30[0][0]'] 
                                                                                                  
 activation_27 (Activation)     (None, 2, 2, 128)    0           ['add_8[0][0]']                  
                                                                                                  
 conv2d_31 (Conv2D)             (None, 2, 2, 32)     4128        ['activation_27[0][0]']          
                                                                                                  
 batch_normalization_31 (BatchN  (None, 2, 2, 32)    128         ['conv2d_31[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_28 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_31[0][0]'] 
                                                                                                  
 conv2d_32 (Conv2D)             (None, 2, 2, 32)     9248        ['activation_28[0][0]']          
                                                                                                  
 batch_normalization_32 (BatchN  (None, 2, 2, 32)    128         ['conv2d_32[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_29 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_32[0][0]'] 
                                                                                                  
 conv2d_33 (Conv2D)             (None, 2, 2, 128)    4224        ['activation_29[0][0]']          
                                                                                                  
 batch_normalization_33 (BatchN  (None, 2, 2, 128)   512         ['conv2d_33[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_9 (Add)                    (None, 2, 2, 128)    0           ['batch_normalization_33[0][0]', 
                                                                  'activation_27[0][0]']          
                                                                                                  
 activation_30 (Activation)     (None, 2, 2, 128)    0           ['add_9[0][0]']                  
                                                                                                  
 conv2d_34 (Conv2D)             (None, 2, 2, 32)     4128        ['activation_30[0][0]']          
                                                                                                  
 batch_normalization_34 (BatchN  (None, 2, 2, 32)    128         ['conv2d_34[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_31 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_34[0][0]'] 
                                                                                                  
 conv2d_35 (Conv2D)             (None, 2, 2, 32)     9248        ['activation_31[0][0]']          
                                                                                                  
 batch_normalization_35 (BatchN  (None, 2, 2, 32)    128         ['conv2d_35[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_32 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_35[0][0]'] 
                                                                                                  
 conv2d_36 (Conv2D)             (None, 2, 2, 128)    4224        ['activation_32[0][0]']          
                                                                                                  
 batch_normalization_36 (BatchN  (None, 2, 2, 128)   512         ['conv2d_36[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_10 (Add)                   (None, 2, 2, 128)    0           ['batch_normalization_36[0][0]', 
                                                                  'activation_30[0][0]']          
                                                                                                  
 activation_33 (Activation)     (None, 2, 2, 128)    0           ['add_10[0][0]']                 
                                                                                                  
 conv2d_37 (Conv2D)             (None, 2, 2, 32)     4128        ['activation_33[0][0]']          
                                                                                                  
 batch_normalization_37 (BatchN  (None, 2, 2, 32)    128         ['conv2d_37[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_34 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_37[0][0]'] 
                                                                                                  
 conv2d_38 (Conv2D)             (None, 2, 2, 32)     9248        ['activation_34[0][0]']          
                                                                                                  
 batch_normalization_38 (BatchN  (None, 2, 2, 32)    128         ['conv2d_38[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_35 (Activation)     (None, 2, 2, 32)     0           ['batch_normalization_38[0][0]'] 
                                                                                                  
 conv2d_39 (Conv2D)             (None, 2, 2, 128)    4224        ['activation_35[0][0]']          
                                                                                                  
 batch_normalization_39 (BatchN  (None, 2, 2, 128)   512         ['conv2d_39[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_11 (Add)                   (None, 2, 2, 128)    0           ['batch_normalization_39[0][0]', 
                                                                  'activation_33[0][0]']          
                                                                                                  
 activation_36 (Activation)     (None, 2, 2, 128)    0           ['add_11[0][0]']                 
                                                                                                  
 conv2d_40 (Conv2D)             (None, 1, 1, 64)     8256        ['activation_36[0][0]']          
                                                                                                  
 batch_normalization_40 (BatchN  (None, 1, 1, 64)    256         ['conv2d_40[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_37 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_40[0][0]'] 
                                                                                                  
 conv2d_41 (Conv2D)             (None, 1, 1, 64)     36928       ['activation_37[0][0]']          
                                                                                                  
 batch_normalization_41 (BatchN  (None, 1, 1, 64)    256         ['conv2d_41[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_38 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_41[0][0]'] 
                                                                                                  
 conv2d_42 (Conv2D)             (None, 1, 1, 256)    16640       ['activation_38[0][0]']          
                                                                                                  
 conv2d_43 (Conv2D)             (None, 1, 1, 256)    33024       ['activation_36[0][0]']          
                                                                                                  
 batch_normalization_42 (BatchN  (None, 1, 1, 256)   1024        ['conv2d_42[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 batch_normalization_43 (BatchN  (None, 1, 1, 256)   1024        ['conv2d_43[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_12 (Add)                   (None, 1, 1, 256)    0           ['batch_normalization_42[0][0]', 
                                                                  'batch_normalization_43[0][0]'] 
                                                                                                  
 activation_39 (Activation)     (None, 1, 1, 256)    0           ['add_12[0][0]']                 
                                                                                                  
 conv2d_44 (Conv2D)             (None, 1, 1, 64)     16448       ['activation_39[0][0]']          
                                                                                                  
 batch_normalization_44 (BatchN  (None, 1, 1, 64)    256         ['conv2d_44[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_40 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_44[0][0]'] 
                                                                                                  
 conv2d_45 (Conv2D)             (None, 1, 1, 64)     36928       ['activation_40[0][0]']          
                                                                                                  
 batch_normalization_45 (BatchN  (None, 1, 1, 64)    256         ['conv2d_45[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_41 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_45[0][0]'] 
                                                                                                  
 conv2d_46 (Conv2D)             (None, 1, 1, 256)    16640       ['activation_41[0][0]']          
                                                                                                  
 batch_normalization_46 (BatchN  (None, 1, 1, 256)   1024        ['conv2d_46[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_13 (Add)                   (None, 1, 1, 256)    0           ['batch_normalization_46[0][0]', 
                                                                  'activation_39[0][0]']          
                                                                                                  
 activation_42 (Activation)     (None, 1, 1, 256)    0           ['add_13[0][0]']                 
                                                                                                  
 conv2d_47 (Conv2D)             (None, 1, 1, 64)     16448       ['activation_42[0][0]']          
                                                                                                  
 batch_normalization_47 (BatchN  (None, 1, 1, 64)    256         ['conv2d_47[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_43 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_47[0][0]'] 
                                                                                                  
 conv2d_48 (Conv2D)             (None, 1, 1, 64)     36928       ['activation_43[0][0]']          
                                                                                                  
 batch_normalization_48 (BatchN  (None, 1, 1, 64)    256         ['conv2d_48[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_44 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_48[0][0]'] 
                                                                                                  
 conv2d_49 (Conv2D)             (None, 1, 1, 256)    16640       ['activation_44[0][0]']          
                                                                                                  
 batch_normalization_49 (BatchN  (None, 1, 1, 256)   1024        ['conv2d_49[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_14 (Add)                   (None, 1, 1, 256)    0           ['batch_normalization_49[0][0]', 
                                                                  'activation_42[0][0]']          
                                                                                                  
 activation_45 (Activation)     (None, 1, 1, 256)    0           ['add_14[0][0]']                 
                                                                                                  
 conv2d_50 (Conv2D)             (None, 1, 1, 64)     16448       ['activation_45[0][0]']          
                                                                                                  
 batch_normalization_50 (BatchN  (None, 1, 1, 64)    256         ['conv2d_50[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_46 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_50[0][0]'] 
                                                                                                  
 conv2d_51 (Conv2D)             (None, 1, 1, 64)     36928       ['activation_46[0][0]']          
                                                                                                  
 batch_normalization_51 (BatchN  (None, 1, 1, 64)    256         ['conv2d_51[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 activation_47 (Activation)     (None, 1, 1, 64)     0           ['batch_normalization_51[0][0]'] 
                                                                                                  
 conv2d_52 (Conv2D)             (None, 1, 1, 256)    16640       ['activation_47[0][0]']          
                                                                                                  
 batch_normalization_52 (BatchN  (None, 1, 1, 256)   1024        ['conv2d_52[0][0]']              
 ormalization)                                                                                    
                                                                                                  
 add_15 (Add)                   (None, 1, 1, 256)    0           ['batch_normalization_52[0][0]', 
                                                                  'activation_45[0][0]']          
                                                                                                  
 activation_48 (Activation)     (None, 1, 1, 256)    0           ['add_15[0][0]']                 
                                                                                                  
 average_pooling2d (AveragePool  (None, 1, 1, 256)   0           ['activation_48[0][0]']          
 ing2D)                                                                                           
                                                                                                  
 flatten (Flatten)              (None, 256)          0           ['average_pooling2d[0][0]']      
                                                                                                  
 dense (Dense)                  (None, 256)          65792       ['flatten[0][0]']                
                                                                                                  
 dense_1 (Dense)                (None, 256)          65792       ['dense[0][0]']                  
                                                                                                  
 dropout (Dropout)              (None, 256)          0           ['dense_1[0][0]']                
                                                                                                  
 dense_2 (Dense)                (None, 15)           3855        ['dropout[0][0]']                
                                                                                                  
==================================================================================================
Total params: 560,175
Trainable params: 553,327
Non-trainable params: 6,848
__________________________________________________________________________________________________

Training without Data Augmentation¶

In [ ]:
%%time
CustomResnet_128.fit(dataset_train_128, epochs=150, validation_data=dataset_test_128, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 13s 58ms/step - loss: 0.4761 - accuracy: 0.1004 - f1_m: 0.0115 - val_loss: 2.9514 - val_accuracy: 0.0893 - val_f1_m: 6.5466e-04
Epoch 2/150
142/142 [==============================] - 7s 51ms/step - loss: 0.4458 - accuracy: 0.1661 - f1_m: 0.0242 - val_loss: 2.9044 - val_accuracy: 0.1473 - val_f1_m: 6.5466e-04
Epoch 3/150
142/142 [==============================] - 7s 51ms/step - loss: 0.4218 - accuracy: 0.2161 - f1_m: 0.0424 - val_loss: 2.5724 - val_accuracy: 0.2683 - val_f1_m: 0.0701
Epoch 4/150
142/142 [==============================] - 8s 52ms/step - loss: 0.3962 - accuracy: 0.2862 - f1_m: 0.0856 - val_loss: 2.3151 - val_accuracy: 0.3487 - val_f1_m: 0.1433
Epoch 5/150
142/142 [==============================] - 7s 51ms/step - loss: 0.3714 - accuracy: 0.3437 - f1_m: 0.1325 - val_loss: 2.1744 - val_accuracy: 0.3973 - val_f1_m: 0.1900
Epoch 6/150
142/142 [==============================] - 7s 51ms/step - loss: 0.3479 - accuracy: 0.3979 - f1_m: 0.2236 - val_loss: 2.0051 - val_accuracy: 0.4347 - val_f1_m: 0.3113
Epoch 7/150
142/142 [==============================] - 7s 52ms/step - loss: 0.3245 - accuracy: 0.4612 - f1_m: 0.3182 - val_loss: 1.8416 - val_accuracy: 0.4833 - val_f1_m: 0.3894
Epoch 8/150
142/142 [==============================] - 7s 52ms/step - loss: 0.3015 - accuracy: 0.5174 - f1_m: 0.4222 - val_loss: 1.6841 - val_accuracy: 0.5350 - val_f1_m: 0.4525
Epoch 9/150
142/142 [==============================] - 7s 51ms/step - loss: 0.2809 - accuracy: 0.5754 - f1_m: 0.5038 - val_loss: 1.5543 - val_accuracy: 0.5777 - val_f1_m: 0.5341
Epoch 10/150
142/142 [==============================] - 7s 51ms/step - loss: 0.2630 - accuracy: 0.6163 - f1_m: 0.5628 - val_loss: 1.5529 - val_accuracy: 0.5783 - val_f1_m: 0.5282
Epoch 11/150
142/142 [==============================] - 7s 51ms/step - loss: 0.2449 - accuracy: 0.6526 - f1_m: 0.6263 - val_loss: 1.3853 - val_accuracy: 0.6320 - val_f1_m: 0.6078
Epoch 12/150
142/142 [==============================] - 8s 53ms/step - loss: 0.2267 - accuracy: 0.7020 - f1_m: 0.6825 - val_loss: 1.2618 - val_accuracy: 0.6687 - val_f1_m: 0.6452
Epoch 13/150
142/142 [==============================] - 8s 53ms/step - loss: 0.2126 - accuracy: 0.7278 - f1_m: 0.7108 - val_loss: 1.2249 - val_accuracy: 0.6680 - val_f1_m: 0.6640
Epoch 14/150
142/142 [==============================] - 8s 54ms/step - loss: 0.2018 - accuracy: 0.7501 - f1_m: 0.7275 - val_loss: 1.2489 - val_accuracy: 0.6700 - val_f1_m: 0.6700
Epoch 15/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1865 - accuracy: 0.7822 - f1_m: 0.7703 - val_loss: 1.1241 - val_accuracy: 0.7087 - val_f1_m: 0.7144
Epoch 16/150
142/142 [==============================] - 8s 53ms/step - loss: 0.1747 - accuracy: 0.8120 - f1_m: 0.8009 - val_loss: 1.1326 - val_accuracy: 0.6927 - val_f1_m: 0.6961
Epoch 17/150
142/142 [==============================] - 7s 52ms/step - loss: 0.1646 - accuracy: 0.8201 - f1_m: 0.8121 - val_loss: 1.2012 - val_accuracy: 0.6850 - val_f1_m: 0.6900
Epoch 18/150
142/142 [==============================] - 8s 53ms/step - loss: 0.1575 - accuracy: 0.8239 - f1_m: 0.8169 - val_loss: 1.1195 - val_accuracy: 0.7080 - val_f1_m: 0.7147
Epoch 19/150
142/142 [==============================] - 7s 52ms/step - loss: 0.1459 - accuracy: 0.8533 - f1_m: 0.8495 - val_loss: 1.3270 - val_accuracy: 0.6653 - val_f1_m: 0.6679
Epoch 20/150
142/142 [==============================] - 7s 52ms/step - loss: 0.1413 - accuracy: 0.8442 - f1_m: 0.8348 - val_loss: 1.0551 - val_accuracy: 0.7160 - val_f1_m: 0.7267
Epoch 21/150
142/142 [==============================] - 7s 52ms/step - loss: 0.1495 - accuracy: 0.7660 - f1_m: 0.7558 - val_loss: 1.0417 - val_accuracy: 0.7190 - val_f1_m: 0.7256
Epoch 22/150
142/142 [==============================] - 7s 52ms/step - loss: 0.1256 - accuracy: 0.8721 - f1_m: 0.8680 - val_loss: 1.0565 - val_accuracy: 0.7280 - val_f1_m: 0.7299
Epoch 23/150
142/142 [==============================] - 7s 50ms/step - loss: 0.1331 - accuracy: 0.8029 - f1_m: 0.7957 - val_loss: 1.0204 - val_accuracy: 0.7383 - val_f1_m: 0.7399
Epoch 24/150
142/142 [==============================] - 7s 51ms/step - loss: 0.1128 - accuracy: 0.8898 - f1_m: 0.8827 - val_loss: 0.9573 - val_accuracy: 0.7557 - val_f1_m: 0.7632
Epoch 25/150
142/142 [==============================] - 7s 50ms/step - loss: 0.1194 - accuracy: 0.8258 - f1_m: 0.8238 - val_loss: 0.9153 - val_accuracy: 0.7657 - val_f1_m: 0.7716
Epoch 26/150
142/142 [==============================] - 7s 50ms/step - loss: 0.1009 - accuracy: 0.9080 - f1_m: 0.9017 - val_loss: 0.8852 - val_accuracy: 0.7787 - val_f1_m: 0.7831
Epoch 27/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0956 - accuracy: 0.9119 - f1_m: 0.9056 - val_loss: 0.8321 - val_accuracy: 0.7873 - val_f1_m: 0.7881
Epoch 28/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0900 - accuracy: 0.9224 - f1_m: 0.9190 - val_loss: 0.7956 - val_accuracy: 0.8040 - val_f1_m: 0.8049
Epoch 29/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0836 - accuracy: 0.9405 - f1_m: 0.9348 - val_loss: 0.8559 - val_accuracy: 0.7893 - val_f1_m: 0.7966
Epoch 30/150
142/142 [==============================] - 8s 52ms/step - loss: 0.0860 - accuracy: 0.9019 - f1_m: 0.8962 - val_loss: 0.9076 - val_accuracy: 0.7630 - val_f1_m: 0.7651
Epoch 31/150
142/142 [==============================] - 8s 52ms/step - loss: 0.0804 - accuracy: 0.9178 - f1_m: 0.9137 - val_loss: 0.8036 - val_accuracy: 0.7913 - val_f1_m: 0.7998
Epoch 32/150
142/142 [==============================] - 7s 51ms/step - loss: 0.0723 - accuracy: 0.9473 - f1_m: 0.9467 - val_loss: 0.8017 - val_accuracy: 0.8047 - val_f1_m: 0.8101
Epoch 33/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0659 - accuracy: 0.9677 - f1_m: 0.9657 - val_loss: 0.8256 - val_accuracy: 0.7960 - val_f1_m: 0.8046
Epoch 34/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0630 - accuracy: 0.9646 - f1_m: 0.9658 - val_loss: 0.7838 - val_accuracy: 0.8097 - val_f1_m: 0.8161
Epoch 35/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0589 - accuracy: 0.9776 - f1_m: 0.9732 - val_loss: 0.8475 - val_accuracy: 0.7907 - val_f1_m: 0.7969
Epoch 36/150
142/142 [==============================] - 8s 54ms/step - loss: 0.0608 - accuracy: 0.9459 - f1_m: 0.9432 - val_loss: 0.8413 - val_accuracy: 0.7987 - val_f1_m: 0.8053
Epoch 37/150
142/142 [==============================] - 7s 51ms/step - loss: 0.0567 - accuracy: 0.9567 - f1_m: 0.9570 - val_loss: 0.7988 - val_accuracy: 0.8050 - val_f1_m: 0.8106
Epoch 38/150
142/142 [==============================] - 7s 51ms/step - loss: 0.0506 - accuracy: 0.9823 - f1_m: 0.9798 - val_loss: 0.8144 - val_accuracy: 0.8013 - val_f1_m: 0.8087
Epoch 39/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0484 - accuracy: 0.9819 - f1_m: 0.9793 - val_loss: 0.8590 - val_accuracy: 0.7913 - val_f1_m: 0.8000
Epoch 40/150
142/142 [==============================] - 8s 52ms/step - loss: 0.0605 - accuracy: 0.9027 - f1_m: 0.8968 - val_loss: 0.8143 - val_accuracy: 0.7783 - val_f1_m: 0.7854
Epoch 41/150
142/142 [==============================] - 8s 52ms/step - loss: 0.0475 - accuracy: 0.9597 - f1_m: 0.9567 - val_loss: 0.7993 - val_accuracy: 0.7973 - val_f1_m: 0.8011
Epoch 42/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0480 - accuracy: 0.9469 - f1_m: 0.9454 - val_loss: 0.7332 - val_accuracy: 0.8047 - val_f1_m: 0.8139
Epoch 43/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0408 - accuracy: 0.9788 - f1_m: 0.9782 - val_loss: 0.7212 - val_accuracy: 0.8140 - val_f1_m: 0.8202
Epoch 44/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0381 - accuracy: 0.9878 - f1_m: 0.9835 - val_loss: 0.7313 - val_accuracy: 0.8193 - val_f1_m: 0.8233
Epoch 45/150
142/142 [==============================] - 7s 51ms/step - loss: 0.0366 - accuracy: 0.9874 - f1_m: 0.9845 - val_loss: 0.7812 - val_accuracy: 0.8103 - val_f1_m: 0.8183
Epoch 46/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0385 - accuracy: 0.9651 - f1_m: 0.9576 - val_loss: 0.7768 - val_accuracy: 0.8113 - val_f1_m: 0.8159
Epoch 47/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0375 - accuracy: 0.9601 - f1_m: 0.9557 - val_loss: 0.7497 - val_accuracy: 0.8057 - val_f1_m: 0.8141
Epoch 48/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0338 - accuracy: 0.9768 - f1_m: 0.9734 - val_loss: 0.7209 - val_accuracy: 0.8207 - val_f1_m: 0.8261
Epoch 49/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0375 - accuracy: 0.9442 - f1_m: 0.9430 - val_loss: 0.7580 - val_accuracy: 0.8040 - val_f1_m: 0.8121
Epoch 50/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0303 - accuracy: 0.9811 - f1_m: 0.9783 - val_loss: 0.6991 - val_accuracy: 0.8280 - val_f1_m: 0.8323
Epoch 51/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0305 - accuracy: 0.9733 - f1_m: 0.9705 - val_loss: 0.7451 - val_accuracy: 0.8120 - val_f1_m: 0.8191
Epoch 52/150
142/142 [==============================] - 7s 51ms/step - loss: 0.0279 - accuracy: 0.9833 - f1_m: 0.9822 - val_loss: 0.6883 - val_accuracy: 0.8263 - val_f1_m: 0.8312
Epoch 53/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0254 - accuracy: 0.9907 - f1_m: 0.9893 - val_loss: 0.6565 - val_accuracy: 0.8330 - val_f1_m: 0.8402
Epoch 54/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0245 - accuracy: 0.9899 - f1_m: 0.9867 - val_loss: 0.7146 - val_accuracy: 0.8300 - val_f1_m: 0.8331
Epoch 55/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0327 - accuracy: 0.9344 - f1_m: 0.9324 - val_loss: 0.7435 - val_accuracy: 0.8150 - val_f1_m: 0.8175
Epoch 56/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0243 - accuracy: 0.9804 - f1_m: 0.9769 - val_loss: 0.7419 - val_accuracy: 0.8167 - val_f1_m: 0.8208
Epoch 57/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0292 - accuracy: 0.9457 - f1_m: 0.9422 - val_loss: 0.7811 - val_accuracy: 0.8107 - val_f1_m: 0.8150
Epoch 58/150
142/142 [==============================] - 7s 50ms/step - loss: 0.0248 - accuracy: 0.9693 - f1_m: 0.9655 - val_loss: 0.7947 - val_accuracy: 0.8037 - val_f1_m: 0.8084
Epoch 59/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0221 - accuracy: 0.9819 - f1_m: 0.9765 - val_loss: 0.8003 - val_accuracy: 0.8033 - val_f1_m: 0.8078
Epoch 60/150
142/142 [==============================] - 7s 52ms/step - loss: 0.0292 - accuracy: 0.9330 - f1_m: 0.9302 - val_loss: 0.7062 - val_accuracy: 0.8190 - val_f1_m: 0.8238
Epoch 61/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0202 - accuracy: 0.9827 - f1_m: 0.9814 - val_loss: 0.7142 - val_accuracy: 0.8247 - val_f1_m: 0.8307
Epoch 62/150
142/142 [==============================] - 8s 54ms/step - loss: 0.0215 - accuracy: 0.9719 - f1_m: 0.9659 - val_loss: 0.7111 - val_accuracy: 0.8230 - val_f1_m: 0.8276
Epoch 63/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0198 - accuracy: 0.9777 - f1_m: 0.9745 - val_loss: 0.6689 - val_accuracy: 0.8333 - val_f1_m: 0.8365
Epoch 63: early stopping
CPU times: total: 2min 55s
Wall time: 7min 54s
Out[ ]:
<keras.callbacks.History at 0x1de5c926d90>
In [ ]:
%%time
CustomResnet_31.fit(dataset_train_31, epochs=150, validation_data=dataset_test_31, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 13s 42ms/step - loss: 0.4083 - accuracy: 0.0836 - f1_m: 0.0032 - val_loss: 2.9654 - val_accuracy: 0.1033 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 5s 35ms/step - loss: 0.3812 - accuracy: 0.1365 - f1_m: 0.0056 - val_loss: 2.9135 - val_accuracy: 0.1187 - val_f1_m: 0.0123
Epoch 3/150
142/142 [==============================] - 5s 35ms/step - loss: 0.3607 - accuracy: 0.1728 - f1_m: 0.0203 - val_loss: 2.6146 - val_accuracy: 0.2047 - val_f1_m: 0.0141
Epoch 4/150
142/142 [==============================] - 5s 34ms/step - loss: 0.3410 - accuracy: 0.2116 - f1_m: 0.0413 - val_loss: 2.4562 - val_accuracy: 0.2567 - val_f1_m: 0.0598
Epoch 5/150
142/142 [==============================] - 5s 36ms/step - loss: 0.3233 - accuracy: 0.2388 - f1_m: 0.0667 - val_loss: 2.3426 - val_accuracy: 0.2870 - val_f1_m: 0.0813
Epoch 6/150
142/142 [==============================] - 5s 37ms/step - loss: 0.3108 - accuracy: 0.2500 - f1_m: 0.0712 - val_loss: 2.2506 - val_accuracy: 0.3380 - val_f1_m: 0.1076
Epoch 7/150
142/142 [==============================] - 5s 37ms/step - loss: 0.2920 - accuracy: 0.2965 - f1_m: 0.1235 - val_loss: 2.4821 - val_accuracy: 0.2710 - val_f1_m: 0.1290
Epoch 8/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2990 - accuracy: 0.2010 - f1_m: 0.0203 - val_loss: 2.5610 - val_accuracy: 0.2100 - val_f1_m: 0.0444
Epoch 9/150
142/142 [==============================] - 5s 38ms/step - loss: 0.2793 - accuracy: 0.2601 - f1_m: 0.0633 - val_loss: 2.2077 - val_accuracy: 0.3213 - val_f1_m: 0.0890
Epoch 10/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2631 - accuracy: 0.3090 - f1_m: 0.1158 - val_loss: 2.0837 - val_accuracy: 0.3583 - val_f1_m: 0.1944
Epoch 11/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2527 - accuracy: 0.3207 - f1_m: 0.1470 - val_loss: 2.0381 - val_accuracy: 0.3740 - val_f1_m: 0.2442
Epoch 12/150
142/142 [==============================] - 5s 38ms/step - loss: 0.2415 - accuracy: 0.3420 - f1_m: 0.1844 - val_loss: 1.9615 - val_accuracy: 0.4127 - val_f1_m: 0.2511
Epoch 13/150
142/142 [==============================] - 5s 37ms/step - loss: 0.2286 - accuracy: 0.3792 - f1_m: 0.2515 - val_loss: 1.8474 - val_accuracy: 0.4537 - val_f1_m: 0.3288
Epoch 14/150
142/142 [==============================] - 5s 36ms/step - loss: 0.2197 - accuracy: 0.3938 - f1_m: 0.2740 - val_loss: 1.8096 - val_accuracy: 0.4573 - val_f1_m: 0.3951
Epoch 15/150
142/142 [==============================] - 5s 35ms/step - loss: 0.2088 - accuracy: 0.4175 - f1_m: 0.3157 - val_loss: 1.7768 - val_accuracy: 0.4663 - val_f1_m: 0.3987
Epoch 16/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1978 - accuracy: 0.4502 - f1_m: 0.3615 - val_loss: 1.7149 - val_accuracy: 0.4937 - val_f1_m: 0.4338
Epoch 17/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1917 - accuracy: 0.4495 - f1_m: 0.3636 - val_loss: 1.7532 - val_accuracy: 0.4793 - val_f1_m: 0.4364
Epoch 18/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1864 - accuracy: 0.4521 - f1_m: 0.3676 - val_loss: 1.6067 - val_accuracy: 0.5110 - val_f1_m: 0.4681
Epoch 19/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1784 - accuracy: 0.4718 - f1_m: 0.3944 - val_loss: 1.5518 - val_accuracy: 0.5347 - val_f1_m: 0.4763
Epoch 20/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1678 - accuracy: 0.5068 - f1_m: 0.4410 - val_loss: 1.5318 - val_accuracy: 0.5303 - val_f1_m: 0.4870
Epoch 21/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1739 - accuracy: 0.4490 - f1_m: 0.3552 - val_loss: 1.6464 - val_accuracy: 0.5010 - val_f1_m: 0.4377
Epoch 22/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1620 - accuracy: 0.4938 - f1_m: 0.4185 - val_loss: 1.5428 - val_accuracy: 0.5317 - val_f1_m: 0.4808
Epoch 23/150
142/142 [==============================] - 5s 37ms/step - loss: 0.1536 - accuracy: 0.5196 - f1_m: 0.4491 - val_loss: 1.4553 - val_accuracy: 0.5523 - val_f1_m: 0.5167
Epoch 24/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1504 - accuracy: 0.5142 - f1_m: 0.4488 - val_loss: 1.4585 - val_accuracy: 0.5550 - val_f1_m: 0.5134
Epoch 25/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1406 - accuracy: 0.5535 - f1_m: 0.4971 - val_loss: 1.4752 - val_accuracy: 0.5530 - val_f1_m: 0.5359
Epoch 26/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1360 - accuracy: 0.5585 - f1_m: 0.5055 - val_loss: 1.4117 - val_accuracy: 0.5703 - val_f1_m: 0.5487
Epoch 27/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1308 - accuracy: 0.5689 - f1_m: 0.5129 - val_loss: 1.4372 - val_accuracy: 0.5757 - val_f1_m: 0.5498
Epoch 28/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1283 - accuracy: 0.5726 - f1_m: 0.5153 - val_loss: 1.3174 - val_accuracy: 0.6073 - val_f1_m: 0.5633
Epoch 29/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1175 - accuracy: 0.6112 - f1_m: 0.5767 - val_loss: 1.2980 - val_accuracy: 0.5977 - val_f1_m: 0.5926
Epoch 30/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1131 - accuracy: 0.6220 - f1_m: 0.5881 - val_loss: 1.2755 - val_accuracy: 0.6220 - val_f1_m: 0.6100
Epoch 31/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1107 - accuracy: 0.6238 - f1_m: 0.5910 - val_loss: 1.2757 - val_accuracy: 0.6157 - val_f1_m: 0.6105
Epoch 32/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1053 - accuracy: 0.6339 - f1_m: 0.6089 - val_loss: 1.2946 - val_accuracy: 0.6190 - val_f1_m: 0.6088
Epoch 33/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1002 - accuracy: 0.6609 - f1_m: 0.6265 - val_loss: 1.2433 - val_accuracy: 0.6337 - val_f1_m: 0.6191
Epoch 34/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1225 - accuracy: 0.5251 - f1_m: 0.4758 - val_loss: 1.7897 - val_accuracy: 0.4753 - val_f1_m: 0.4478
Epoch 35/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1628 - accuracy: 0.2895 - f1_m: 0.1006 - val_loss: 2.1136 - val_accuracy: 0.3277 - val_f1_m: 0.1608
Epoch 36/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1403 - accuracy: 0.3928 - f1_m: 0.2495 - val_loss: 1.8039 - val_accuracy: 0.4287 - val_f1_m: 0.3028
Epoch 37/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1343 - accuracy: 0.4111 - f1_m: 0.2844 - val_loss: 1.6605 - val_accuracy: 0.4773 - val_f1_m: 0.3700
Epoch 38/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1226 - accuracy: 0.4665 - f1_m: 0.3785 - val_loss: 1.5140 - val_accuracy: 0.5257 - val_f1_m: 0.4480
Epoch 39/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1145 - accuracy: 0.5051 - f1_m: 0.4277 - val_loss: 1.4530 - val_accuracy: 0.5420 - val_f1_m: 0.4879
Epoch 40/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1087 - accuracy: 0.5322 - f1_m: 0.4635 - val_loss: 1.4347 - val_accuracy: 0.5547 - val_f1_m: 0.5103
Epoch 41/150
142/142 [==============================] - 5s 34ms/step - loss: 0.1044 - accuracy: 0.5444 - f1_m: 0.4889 - val_loss: 1.4611 - val_accuracy: 0.5547 - val_f1_m: 0.5160
Epoch 42/150
142/142 [==============================] - 5s 36ms/step - loss: 0.1192 - accuracy: 0.4444 - f1_m: 0.3632 - val_loss: 1.5653 - val_accuracy: 0.5073 - val_f1_m: 0.4577
Epoch 43/150
142/142 [==============================] - 5s 35ms/step - loss: 0.1026 - accuracy: 0.5379 - f1_m: 0.4787 - val_loss: 1.3226 - val_accuracy: 0.5903 - val_f1_m: 0.5557
Epoch 43: early stopping
CPU times: total: 1min 18s
Wall time: 3min 47s
Out[ ]:
<keras.callbacks.History at 0x1de5c9581f0>
In [ ]:
evaluate_and_save_model(CustomResnet_128, 'CustomResnet_128', 64,save_models=False)
evaluate_and_save_model(CustomResnet_31, 'CustomResnet_31', 64,save_models=False)
Model Name            CustomResnet_128
Epochs                              63
Batch Size                          64
Train Loss                    0.019828
Val Loss                      0.668877
Train Acc                     0.977736
Val Acc                       0.833333
[Train - Val] Acc             0.144403
[Train - Val] Loss           -0.649049
Name: CustomResnet_128, dtype: object
Model Name            CustomResnet_31
Epochs                             43
Batch Size                         64
Train Loss                   0.100193
Val Loss                     1.243305
Train Acc                    0.660944
Val Acc                      0.633667
[Train - Val] Acc            0.027277
[Train - Val] Loss          -1.143112
Name: CustomResnet_31, dtype: object
In [ ]:
customResnet_history_128 = json.load(open('./models/CustomResnet_128_history.json', 'r'))
customResnet_history_31 = json.load(open('./models/CustomResnet_31_history.json', 'r'))
compare_curves(customResnet_history_31, customResnet_history_128, '31x31', '128x128')
No description has been provided for this image

Observations:

  • We can see that from our loss curve, both models show signs of overfitting
  • However we can see from the graph that our accuracy for 31x31, the validation curve mirrors the train accuracy curve, Why is this the case?
    • This can be because accuracy might not be a sensitive enough metric to detect overfitting in this context. and our model might be too complex for 31x31 images.
In [ ]:
plt.plot(customResnet_history_31['f1_m'], 'o-', label='Train F1')
plt.plot(customResnet_history_31['val_f1_m'], 'o-', label='Validation F1')
plt.title('Accuracy Curve - ' + '31x31')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend()
Out[ ]:
<matplotlib.legend.Legend at 0x2609a994eb0>
No description has been provided for this image

We can see that even with plotting out the Train and validation of F1, we still see the same mirroring of train and validation.

Training with Data Augmentation¶

In [ ]:
%%time
CustomResnet_128_DA = CustomResnet(input_shape=(128, 128, 1), classes=15)
CustomResnet_128_DA.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
CustomResnet_128_DA.fit(train_generator_128, epochs=150, validation_data=dataset_test_128, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 15s 66ms/step - loss: 0.4802 - accuracy: 0.0769 - f1_m: 0.0049 - val_loss: 3.5027 - val_accuracy: 0.0763 - val_f1_m: 0.0619
Epoch 2/150
142/142 [==============================] - 8s 56ms/step - loss: 0.4518 - accuracy: 0.1279 - f1_m: 0.0069 - val_loss: 2.7846 - val_accuracy: 0.1653 - val_f1_m: 0.0300
Epoch 3/150
142/142 [==============================] - 8s 56ms/step - loss: 0.4259 - accuracy: 0.1770 - f1_m: 0.0133 - val_loss: 2.6348 - val_accuracy: 0.2270 - val_f1_m: 0.0182
Epoch 4/150
142/142 [==============================] - 8s 55ms/step - loss: 0.4022 - accuracy: 0.2296 - f1_m: 0.0305 - val_loss: 2.4979 - val_accuracy: 0.2590 - val_f1_m: 0.0570
Epoch 5/150
142/142 [==============================] - 8s 56ms/step - loss: 0.3792 - accuracy: 0.2826 - f1_m: 0.0526 - val_loss: 2.2609 - val_accuracy: 0.3463 - val_f1_m: 0.1503
Epoch 6/150
142/142 [==============================] - 8s 55ms/step - loss: 0.3551 - accuracy: 0.3439 - f1_m: 0.1247 - val_loss: 2.0796 - val_accuracy: 0.4207 - val_f1_m: 0.2273
Epoch 7/150
142/142 [==============================] - 8s 55ms/step - loss: 0.3329 - accuracy: 0.3959 - f1_m: 0.2136 - val_loss: 1.8382 - val_accuracy: 0.4853 - val_f1_m: 0.3403
Epoch 8/150
142/142 [==============================] - 8s 55ms/step - loss: 0.3126 - accuracy: 0.4476 - f1_m: 0.3010 - val_loss: 1.7053 - val_accuracy: 0.5263 - val_f1_m: 0.4253
Epoch 9/150
142/142 [==============================] - 8s 55ms/step - loss: 0.2936 - accuracy: 0.4968 - f1_m: 0.3808 - val_loss: 1.5935 - val_accuracy: 0.5543 - val_f1_m: 0.4888
Epoch 10/150
142/142 [==============================] - 8s 56ms/step - loss: 0.2770 - accuracy: 0.5308 - f1_m: 0.4510 - val_loss: 1.4483 - val_accuracy: 0.6077 - val_f1_m: 0.5558
Epoch 11/150
142/142 [==============================] - 8s 55ms/step - loss: 0.2610 - accuracy: 0.5567 - f1_m: 0.4939 - val_loss: 1.3274 - val_accuracy: 0.6397 - val_f1_m: 0.6061
Epoch 12/150
142/142 [==============================] - 8s 55ms/step - loss: 0.2446 - accuracy: 0.5967 - f1_m: 0.5467 - val_loss: 1.3001 - val_accuracy: 0.6407 - val_f1_m: 0.6115
Epoch 13/150
142/142 [==============================] - 8s 56ms/step - loss: 0.2343 - accuracy: 0.6022 - f1_m: 0.5610 - val_loss: 1.2002 - val_accuracy: 0.6797 - val_f1_m: 0.6564
Epoch 14/150
142/142 [==============================] - 8s 55ms/step - loss: 0.2179 - accuracy: 0.6470 - f1_m: 0.6135 - val_loss: 1.1435 - val_accuracy: 0.6977 - val_f1_m: 0.6774
Epoch 15/150
142/142 [==============================] - 8s 56ms/step - loss: 0.2037 - accuracy: 0.6793 - f1_m: 0.6530 - val_loss: 1.0348 - val_accuracy: 0.7233 - val_f1_m: 0.7224
Epoch 16/150
142/142 [==============================] - 8s 57ms/step - loss: 0.1949 - accuracy: 0.6854 - f1_m: 0.6666 - val_loss: 0.9449 - val_accuracy: 0.7527 - val_f1_m: 0.7468
Epoch 17/150
142/142 [==============================] - 8s 57ms/step - loss: 0.1820 - accuracy: 0.7133 - f1_m: 0.6979 - val_loss: 0.9468 - val_accuracy: 0.7507 - val_f1_m: 0.7460
Epoch 18/150
142/142 [==============================] - 8s 55ms/step - loss: 0.1721 - accuracy: 0.7349 - f1_m: 0.7240 - val_loss: 0.8697 - val_accuracy: 0.7670 - val_f1_m: 0.7705
Epoch 19/150
142/142 [==============================] - 8s 56ms/step - loss: 0.1654 - accuracy: 0.7363 - f1_m: 0.7230 - val_loss: 0.9581 - val_accuracy: 0.7383 - val_f1_m: 0.7276
Epoch 20/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1555 - accuracy: 0.7558 - f1_m: 0.7428 - val_loss: 0.8126 - val_accuracy: 0.7790 - val_f1_m: 0.7827
Epoch 21/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1451 - accuracy: 0.7838 - f1_m: 0.7698 - val_loss: 1.0790 - val_accuracy: 0.6997 - val_f1_m: 0.6900
Epoch 22/150
142/142 [==============================] - 8s 56ms/step - loss: 0.1405 - accuracy: 0.7775 - f1_m: 0.7677 - val_loss: 0.7700 - val_accuracy: 0.7890 - val_f1_m: 0.7933
Epoch 23/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1301 - accuracy: 0.8088 - f1_m: 0.8023 - val_loss: 0.8426 - val_accuracy: 0.7680 - val_f1_m: 0.7707
Epoch 24/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1248 - accuracy: 0.8089 - f1_m: 0.8008 - val_loss: 0.6923 - val_accuracy: 0.8220 - val_f1_m: 0.8179
Epoch 25/150
142/142 [==============================] - 8s 55ms/step - loss: 0.1185 - accuracy: 0.8223 - f1_m: 0.8148 - val_loss: 0.7445 - val_accuracy: 0.7937 - val_f1_m: 0.7928
Epoch 26/150
142/142 [==============================] - 8s 55ms/step - loss: 0.1121 - accuracy: 0.8302 - f1_m: 0.8228 - val_loss: 0.7817 - val_accuracy: 0.7827 - val_f1_m: 0.7868
Epoch 27/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1082 - accuracy: 0.8294 - f1_m: 0.8203 - val_loss: 0.6411 - val_accuracy: 0.8253 - val_f1_m: 0.8274
Epoch 28/150
142/142 [==============================] - 8s 54ms/step - loss: 0.1036 - accuracy: 0.8336 - f1_m: 0.8310 - val_loss: 0.6928 - val_accuracy: 0.8220 - val_f1_m: 0.8231
Epoch 29/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0989 - accuracy: 0.8435 - f1_m: 0.8421 - val_loss: 0.5782 - val_accuracy: 0.8440 - val_f1_m: 0.8445
Epoch 30/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0920 - accuracy: 0.8612 - f1_m: 0.8596 - val_loss: 0.6425 - val_accuracy: 0.8260 - val_f1_m: 0.8286
Epoch 31/150
142/142 [==============================] - 8s 57ms/step - loss: 0.0925 - accuracy: 0.8394 - f1_m: 0.8309 - val_loss: 0.6498 - val_accuracy: 0.8237 - val_f1_m: 0.8275
Epoch 32/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0886 - accuracy: 0.8435 - f1_m: 0.8368 - val_loss: 0.6247 - val_accuracy: 0.8290 - val_f1_m: 0.8357
Epoch 33/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0817 - accuracy: 0.8663 - f1_m: 0.8593 - val_loss: 0.5580 - val_accuracy: 0.8497 - val_f1_m: 0.8545
Epoch 34/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0810 - accuracy: 0.8573 - f1_m: 0.8509 - val_loss: 0.5990 - val_accuracy: 0.8287 - val_f1_m: 0.8321
Epoch 35/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0731 - accuracy: 0.8845 - f1_m: 0.8780 - val_loss: 0.5389 - val_accuracy: 0.8593 - val_f1_m: 0.8613
Epoch 36/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0706 - accuracy: 0.8850 - f1_m: 0.8834 - val_loss: 0.5002 - val_accuracy: 0.8633 - val_f1_m: 0.8678
Epoch 37/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0657 - accuracy: 0.8989 - f1_m: 0.8985 - val_loss: 0.5601 - val_accuracy: 0.8403 - val_f1_m: 0.8416
Epoch 38/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0619 - accuracy: 0.9081 - f1_m: 0.9040 - val_loss: 0.5197 - val_accuracy: 0.8590 - val_f1_m: 0.8591
Epoch 39/150
142/142 [==============================] - 8s 57ms/step - loss: 0.0617 - accuracy: 0.8963 - f1_m: 0.8936 - val_loss: 0.5745 - val_accuracy: 0.8407 - val_f1_m: 0.8452
Epoch 40/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0584 - accuracy: 0.9041 - f1_m: 0.9029 - val_loss: 0.5357 - val_accuracy: 0.8527 - val_f1_m: 0.8558
Epoch 41/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0549 - accuracy: 0.9122 - f1_m: 0.9127 - val_loss: 0.4865 - val_accuracy: 0.8647 - val_f1_m: 0.8691
Epoch 42/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0522 - accuracy: 0.9175 - f1_m: 0.9162 - val_loss: 0.5436 - val_accuracy: 0.8470 - val_f1_m: 0.8512
Epoch 43/150
142/142 [==============================] - 9s 61ms/step - loss: 0.0503 - accuracy: 0.9180 - f1_m: 0.9180 - val_loss: 0.4555 - val_accuracy: 0.8767 - val_f1_m: 0.8773
Epoch 44/150
142/142 [==============================] - 8s 56ms/step - loss: 0.0491 - accuracy: 0.9145 - f1_m: 0.9131 - val_loss: 0.5480 - val_accuracy: 0.8490 - val_f1_m: 0.8505
Epoch 45/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0472 - accuracy: 0.9178 - f1_m: 0.9100 - val_loss: 0.6330 - val_accuracy: 0.8157 - val_f1_m: 0.8241
Epoch 46/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0478 - accuracy: 0.9054 - f1_m: 0.8988 - val_loss: 1.0532 - val_accuracy: 0.7060 - val_f1_m: 0.7177
Epoch 47/150
142/142 [==============================] - 8s 55ms/step - loss: 0.0458 - accuracy: 0.9096 - f1_m: 0.9117 - val_loss: 0.4878 - val_accuracy: 0.8560 - val_f1_m: 0.8595
Epoch 48/150
142/142 [==============================] - 8s 53ms/step - loss: 0.0413 - accuracy: 0.9272 - f1_m: 0.9205 - val_loss: 0.5603 - val_accuracy: 0.8430 - val_f1_m: 0.8471
Epoch 49/150
142/142 [==============================] - 8s 54ms/step - loss: 0.0475 - accuracy: 0.8852 - f1_m: 0.8811 - val_loss: 0.5809 - val_accuracy: 0.8353 - val_f1_m: 0.8406
Epoch 50/150
142/142 [==============================] - 8s 54ms/step - loss: 0.0397 - accuracy: 0.9176 - f1_m: 0.9187 - val_loss: 0.5045 - val_accuracy: 0.8640 - val_f1_m: 0.8673
Epoch 51/150
142/142 [==============================] - 8s 57ms/step - loss: 0.0384 - accuracy: 0.9237 - f1_m: 0.9199 - val_loss: 0.4923 - val_accuracy: 0.8670 - val_f1_m: 0.8685
Epoch 52/150
142/142 [==============================] - 8s 58ms/step - loss: 0.0357 - accuracy: 0.9297 - f1_m: 0.9279 - val_loss: 0.4998 - val_accuracy: 0.8597 - val_f1_m: 0.8638
Epoch 53/150
142/142 [==============================] - 8s 58ms/step - loss: 0.0348 - accuracy: 0.9321 - f1_m: 0.9318 - val_loss: 0.4773 - val_accuracy: 0.8703 - val_f1_m: 0.8738
Epoch 53: early stopping
CPU times: total: 2min 37s
Wall time: 7min 13s
Out[ ]:
<keras.callbacks.History at 0x260c455e790>

We will be trying to lower our 31x31 model complexity by 3 layers to see whether our model complexity does in fact cause overfitting

In [ ]:
%%time
def CustomResnet(input_shape, classes=15):
    tf.keras.backend.clear_session()
    X_input = Input(input_shape)

    # Stage 1
    X = Conv2D(64, (7, 7), strides=(2, 2), padding='same')(X_input)
    X = BatchNormalization(axis=3)(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((3, 3), strides=(2, 2))(X)

    if input_shape == (31, 31, 1):
        stages = [
            {'blocks': 3, 'filters': [16, 16, 64]},
            {'blocks': 3, 'filters': [32, 32, 128]},
            {'blocks': 3, 'filters': [64, 64, 256]}
        ]
    elif input_shape == (128, 128, 1):
        stages = [
            {'blocks': 4, 'filters': [8, 8, 32]},
            {'blocks': 4, 'filters': [16, 16, 64]},
            {'blocks': 4, 'filters': [32, 32, 128]},
            {'blocks': 4, 'filters': [64, 64, 256]}
        ]
    for i, stage in enumerate(stages):
        X = projection_block(X, f=3, filters=stage['filters'], s=1 if i == 0 else 2)
        for _ in range(stage['blocks']):
            X = identity_block(X, 3, stage['filters'])

    X = AveragePooling2D(pool_size=(2, 2), padding='same')(X)
    X = Flatten()(X)
    X = Dense(256, activation='relu',kernel_regularizer=l2(weight_decay))(X)
    X = Dense(256, activation='relu',kernel_regularizer=l2(weight_decay))(X)
    X = Dropout(0.2)(X)
    X = Dense(classes, activation='softmax')(X)

    model = Model(inputs=X_input, outputs=X, name='ResNet50')

    return model
CustomResnet_31_DA = CustomResnet(input_shape=(31, 31, 1), classes=15)
CustomResnet_31_DA.compile(optimizer=SGD(learning_rate=learning_rate, momentum=momentum), loss='categorical_crossentropy', metrics=['accuracy',f1_m])
CustomResnet_31_DA.fit(train_generator_31, epochs=150, validation_data=dataset_test_31, class_weight=class_weights_dict,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')],steps_per_epoch=steps_per_epoch)
Epoch 1/150
142/142 [==============================] - 16s 54ms/step - loss: 0.4020 - accuracy: 0.0827 - f1_m: 0.0017 - val_loss: 2.9070 - val_accuracy: 0.0983 - val_f1_m: 0.0000e+00
Epoch 2/150
142/142 [==============================] - 4s 30ms/step - loss: 0.3803 - accuracy: 0.1347 - f1_m: 0.0032 - val_loss: 2.7777 - val_accuracy: 0.1567 - val_f1_m: 0.0045
Epoch 3/150
142/142 [==============================] - 4s 30ms/step - loss: 0.3588 - accuracy: 0.1892 - f1_m: 0.0103 - val_loss: 2.6269 - val_accuracy: 0.2173 - val_f1_m: 0.0239
Epoch 4/150
142/142 [==============================] - 4s 31ms/step - loss: 0.3376 - accuracy: 0.2466 - f1_m: 0.0202 - val_loss: 2.3906 - val_accuracy: 0.2877 - val_f1_m: 0.0542
Epoch 5/150
142/142 [==============================] - 4s 30ms/step - loss: 0.3163 - accuracy: 0.3057 - f1_m: 0.0527 - val_loss: 2.1498 - val_accuracy: 0.3673 - val_f1_m: 0.1075
Epoch 6/150
142/142 [==============================] - 4s 30ms/step - loss: 0.2948 - accuracy: 0.3641 - f1_m: 0.1308 - val_loss: 2.0523 - val_accuracy: 0.3990 - val_f1_m: 0.1920
Epoch 7/150
142/142 [==============================] - 4s 30ms/step - loss: 0.2771 - accuracy: 0.4164 - f1_m: 0.2263 - val_loss: 1.9381 - val_accuracy: 0.4210 - val_f1_m: 0.2895
Epoch 8/150
142/142 [==============================] - 4s 30ms/step - loss: 0.2592 - accuracy: 0.4654 - f1_m: 0.3156 - val_loss: 1.6936 - val_accuracy: 0.5207 - val_f1_m: 0.4316
Epoch 9/150
142/142 [==============================] - 5s 32ms/step - loss: 0.2433 - accuracy: 0.5099 - f1_m: 0.3992 - val_loss: 1.8784 - val_accuracy: 0.4533 - val_f1_m: 0.3795
Epoch 10/150
142/142 [==============================] - 5s 32ms/step - loss: 0.2295 - accuracy: 0.5387 - f1_m: 0.4520 - val_loss: 1.4615 - val_accuracy: 0.5873 - val_f1_m: 0.5293
Epoch 11/150
142/142 [==============================] - 5s 33ms/step - loss: 0.2167 - accuracy: 0.5646 - f1_m: 0.4957 - val_loss: 1.3621 - val_accuracy: 0.6283 - val_f1_m: 0.5732
Epoch 12/150
142/142 [==============================] - 5s 31ms/step - loss: 0.2029 - accuracy: 0.6014 - f1_m: 0.5516 - val_loss: 1.3961 - val_accuracy: 0.6073 - val_f1_m: 0.5802
Epoch 13/150
142/142 [==============================] - 4s 31ms/step - loss: 0.1922 - accuracy: 0.6223 - f1_m: 0.5766 - val_loss: 1.3146 - val_accuracy: 0.6310 - val_f1_m: 0.6139
Epoch 14/150
142/142 [==============================] - 4s 30ms/step - loss: 0.1826 - accuracy: 0.6399 - f1_m: 0.6051 - val_loss: 1.1879 - val_accuracy: 0.6723 - val_f1_m: 0.6505
Epoch 15/150
142/142 [==============================] - 4s 29ms/step - loss: 0.1721 - accuracy: 0.6690 - f1_m: 0.6390 - val_loss: 1.1863 - val_accuracy: 0.6673 - val_f1_m: 0.6599
Epoch 16/150
142/142 [==============================] - 4s 30ms/step - loss: 0.1669 - accuracy: 0.6685 - f1_m: 0.6409 - val_loss: 1.3799 - val_accuracy: 0.6160 - val_f1_m: 0.6137
Epoch 17/150
142/142 [==============================] - 4s 30ms/step - loss: 0.1575 - accuracy: 0.6854 - f1_m: 0.6558 - val_loss: 1.1514 - val_accuracy: 0.6747 - val_f1_m: 0.6715
Epoch 18/150
142/142 [==============================] - 4s 30ms/step - loss: 0.1487 - accuracy: 0.6995 - f1_m: 0.6791 - val_loss: 0.9902 - val_accuracy: 0.7387 - val_f1_m: 0.7298
Epoch 19/150
142/142 [==============================] - 4s 30ms/step - loss: 0.1410 - accuracy: 0.7162 - f1_m: 0.7015 - val_loss: 1.0671 - val_accuracy: 0.6973 - val_f1_m: 0.7002
Epoch 20/150
142/142 [==============================] - 4s 31ms/step - loss: 0.1342 - accuracy: 0.7323 - f1_m: 0.7138 - val_loss: 1.0853 - val_accuracy: 0.7023 - val_f1_m: 0.6925
Epoch 21/150
142/142 [==============================] - 5s 32ms/step - loss: 0.1296 - accuracy: 0.7383 - f1_m: 0.7256 - val_loss: 0.9902 - val_accuracy: 0.7260 - val_f1_m: 0.7204
Epoch 22/150
142/142 [==============================] - 5s 32ms/step - loss: 0.1222 - accuracy: 0.7533 - f1_m: 0.7387 - val_loss: 0.9093 - val_accuracy: 0.7533 - val_f1_m: 0.7534
Epoch 23/150
142/142 [==============================] - 5s 32ms/step - loss: 0.1150 - accuracy: 0.7718 - f1_m: 0.7602 - val_loss: 0.9843 - val_accuracy: 0.7267 - val_f1_m: 0.7257
Epoch 24/150
142/142 [==============================] - 5s 31ms/step - loss: 0.1162 - accuracy: 0.7381 - f1_m: 0.7232 - val_loss: 0.8945 - val_accuracy: 0.7490 - val_f1_m: 0.7532
Epoch 25/150
142/142 [==============================] - 4s 30ms/step - loss: 0.1078 - accuracy: 0.7700 - f1_m: 0.7649 - val_loss: 1.2818 - val_accuracy: 0.6430 - val_f1_m: 0.6497
Epoch 26/150
142/142 [==============================] - 4s 31ms/step - loss: 0.1008 - accuracy: 0.7940 - f1_m: 0.7836 - val_loss: 0.8308 - val_accuracy: 0.7743 - val_f1_m: 0.7727
Epoch 27/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0980 - accuracy: 0.7882 - f1_m: 0.7822 - val_loss: 0.8119 - val_accuracy: 0.7757 - val_f1_m: 0.7801
Epoch 28/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0909 - accuracy: 0.8121 - f1_m: 0.8072 - val_loss: 0.9431 - val_accuracy: 0.7387 - val_f1_m: 0.7402
Epoch 29/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0875 - accuracy: 0.8142 - f1_m: 0.8103 - val_loss: 0.9166 - val_accuracy: 0.7347 - val_f1_m: 0.7360
Epoch 30/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0925 - accuracy: 0.7709 - f1_m: 0.7588 - val_loss: 0.7437 - val_accuracy: 0.7980 - val_f1_m: 0.7959
Epoch 31/150
142/142 [==============================] - 4s 29ms/step - loss: 0.0828 - accuracy: 0.8136 - f1_m: 0.8052 - val_loss: 1.1541 - val_accuracy: 0.6770 - val_f1_m: 0.6763
Epoch 32/150
142/142 [==============================] - 4s 29ms/step - loss: 0.0851 - accuracy: 0.7789 - f1_m: 0.7720 - val_loss: 0.9351 - val_accuracy: 0.7313 - val_f1_m: 0.7298
Epoch 33/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0759 - accuracy: 0.8209 - f1_m: 0.8143 - val_loss: 0.7369 - val_accuracy: 0.7993 - val_f1_m: 0.8002
Epoch 34/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0720 - accuracy: 0.8347 - f1_m: 0.8344 - val_loss: 0.7423 - val_accuracy: 0.8010 - val_f1_m: 0.8054
Epoch 35/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0676 - accuracy: 0.8504 - f1_m: 0.8457 - val_loss: 0.7186 - val_accuracy: 0.8117 - val_f1_m: 0.8154
Epoch 36/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0642 - accuracy: 0.8579 - f1_m: 0.8552 - val_loss: 0.7594 - val_accuracy: 0.7913 - val_f1_m: 0.7921
Epoch 37/150
142/142 [==============================] - 4s 31ms/step - loss: 0.0620 - accuracy: 0.8545 - f1_m: 0.8557 - val_loss: 0.8178 - val_accuracy: 0.7627 - val_f1_m: 0.7702
Epoch 38/150
142/142 [==============================] - 5s 31ms/step - loss: 0.0664 - accuracy: 0.8254 - f1_m: 0.8183 - val_loss: 0.7707 - val_accuracy: 0.7850 - val_f1_m: 0.7825
Epoch 39/150
142/142 [==============================] - 4s 30ms/step - loss: 0.0619 - accuracy: 0.8437 - f1_m: 0.8429 - val_loss: 0.7301 - val_accuracy: 0.8013 - val_f1_m: 0.8027
Epoch 40/150
142/142 [==============================] - 4s 31ms/step - loss: 0.0567 - accuracy: 0.8622 - f1_m: 0.8589 - val_loss: 0.6947 - val_accuracy: 0.7990 - val_f1_m: 0.8061
Epoch 41/150
142/142 [==============================] - 5s 31ms/step - loss: 0.0550 - accuracy: 0.8632 - f1_m: 0.8602 - val_loss: 0.6285 - val_accuracy: 0.8273 - val_f1_m: 0.8297
Epoch 42/150
142/142 [==============================] - 5s 33ms/step - loss: 0.0528 - accuracy: 0.8680 - f1_m: 0.8677 - val_loss: 0.6695 - val_accuracy: 0.8100 - val_f1_m: 0.8194
Epoch 43/150
142/142 [==============================] - 5s 33ms/step - loss: 0.0490 - accuracy: 0.8798 - f1_m: 0.8792 - val_loss: 0.9656 - val_accuracy: 0.7410 - val_f1_m: 0.7404
Epoch 44/150
142/142 [==============================] - 5s 31ms/step - loss: 0.0490 - accuracy: 0.8802 - f1_m: 0.8746 - val_loss: 1.4523 - val_accuracy: 0.6097 - val_f1_m: 0.6154
Epoch 45/150
142/142 [==============================] - 4s 31ms/step - loss: 0.0474 - accuracy: 0.8785 - f1_m: 0.8747 - val_loss: 0.7267 - val_accuracy: 0.7960 - val_f1_m: 0.8015
Epoch 46/150
142/142 [==============================] - 5s 32ms/step - loss: 0.0440 - accuracy: 0.8926 - f1_m: 0.8858 - val_loss: 0.6655 - val_accuracy: 0.8187 - val_f1_m: 0.8213
Epoch 47/150
142/142 [==============================] - 5s 32ms/step - loss: 0.0570 - accuracy: 0.8046 - f1_m: 0.7989 - val_loss: 0.6839 - val_accuracy: 0.8057 - val_f1_m: 0.8112
Epoch 48/150
142/142 [==============================] - 4s 31ms/step - loss: 0.0468 - accuracy: 0.8624 - f1_m: 0.8567 - val_loss: 0.7186 - val_accuracy: 0.7980 - val_f1_m: 0.7965
Epoch 49/150
142/142 [==============================] - 4s 31ms/step - loss: 0.0454 - accuracy: 0.8615 - f1_m: 0.8566 - val_loss: 0.7874 - val_accuracy: 0.7750 - val_f1_m: 0.7835
Epoch 50/150
142/142 [==============================] - 4s 31ms/step - loss: 0.0416 - accuracy: 0.8818 - f1_m: 0.8790 - val_loss: 0.6543 - val_accuracy: 0.8183 - val_f1_m: 0.8244
Epoch 51/150
142/142 [==============================] - 5s 31ms/step - loss: 0.0395 - accuracy: 0.8858 - f1_m: 0.8867 - val_loss: 0.6606 - val_accuracy: 0.8170 - val_f1_m: 0.8150
Epoch 51: early stopping
CPU times: total: 1min 23s
Wall time: 4min 1s
Out[ ]:
<keras.callbacks.History at 0x2609a174190>
In [ ]:
evaluate_and_save_model(CustomResnet_128_DA, 'CustomResnet_128_DA', 64,save_models=True)
evaluate_and_save_model(CustomResnet_31_DA, 'CustomResnet_31_DA', 64,save_models=True)
Saved trained model at ./models\CustomResnet_128_DA.h5 
Saved trained model history at ./models\CustomResnet_128_DA_history.json 
Model Name            CustomResnet_128_DA
Epochs                                 53
Batch Size                             64
Train Loss                       0.050298
Val Loss                          0.45547
Train Acc                        0.918033
Val Acc                          0.876667
[Train - Val] Acc                0.041366
[Train - Val] Loss              -0.405172
Name: CustomResnet_128_DA, dtype: object
Saved trained model at ./models\CustomResnet_31_DA.h5 
Saved trained model history at ./models\CustomResnet_31_DA_history.json 
Model Name            CustomResnet_31_DA
Epochs                                51
Batch Size                            64
Train Loss                      0.054986
Val Loss                        0.628499
Train Acc                       0.863203
Val Acc                         0.827333
[Train - Val] Acc                0.03587
[Train - Val] Loss             -0.573513
Name: CustomResnet_31_DA, dtype: object
In [ ]:
customResnet_history_128_DA = json.load(open('./models/CustomResnet_128_DA_history.json', 'r'))
customResnet_history_31_DA = json.load(open('./models/CustomResnet_31_DA_history.json', 'r'))
compare_curves(customResnet_history_31_DA, customResnet_history_128_DA, '31x31', '128x128')
No description has been provided for this image

Observations:

  • We can see a much better result than before data augmentation, espically for our 31x31 model. The improvement can be creditted to both reducing our model's complexity and introducing data augmentation.
  • We can see improvements in both 128x128 and 31x31 in our loss curve.

Choosen model¶

In [ ]:
def load_and_evaluate_model(model_name, batch_size, save_dir='./models'):
    model_history = json.load(open(os.path.join(save_dir, model_name +'_history'+ '.json'), 'r'))

    best_val_idx = np.argmax(model_history["val_accuracy"])
    result = {}
    result["Model Name"] = model_name
    result["Epochs"] = len(model_history["loss"])
    result["Batch Size"] = batch_size
    result["Train Loss"] = model_history["loss"][best_val_idx]
    result["Val Loss"] = model_history["val_loss"][best_val_idx]
    result["Train Acc"] = model_history["accuracy"][best_val_idx]
    result["Val Acc"] = model_history["val_accuracy"][best_val_idx]
    result["[Train - Val] Acc"] = result["Train Acc"] - result["Val Acc"]
    result["[Train - Val] Loss"] = result["Train Loss"] - result["Val Loss"]
    result_series = pd.Series(result, name=result["Model Name"])
    return result_series
def highlight_row(s, row_index):
    return ['background-color: green' if s.name == row_index else '' for _ in s]


evaluation_31_df = pd.DataFrame()

model_names_31 = ['BaseModel_31', 'Basemodel_31_DA', 'Basemodel_31_DA_RE', 'CustomModel_31', 'CustomModel_31_DA', 'CustomResnet_31', 'CustomResnet_31_DA']

batch_size = 64

# Load and evaluate each model and append the result to the DataFrame
for model_name in model_names_31:
    result_series = load_and_evaluate_model(model_name, batch_size)
    evaluation_31_df = pd.concat([evaluation_31_df, result_series], axis=1)

evaluation_31_df = evaluation_31_df.T.reset_index()
evaluation_31_df = evaluation_31_df.drop(['index'], axis=1)
evaluation_31_df = evaluation_31_df.style.apply(highlight_row, row_index=4, axis=1)
display(evaluation_31_df)
  Model Name Epochs Batch Size Train Loss Val Loss Train Acc Val Acc [Train - Val] Acc [Train - Val] Loss
0 BaseModel_31 77 64 0.008457 0.668227 0.949823 0.828333 0.121489 -0.659770
1 Basemodel_31_DA 94 64 0.020766 0.561303 0.882366 0.833667 0.048699 -0.540537
2 Basemodel_31_DA_RE 108 64 0.059987 0.856455 0.869406 0.761667 0.107740 -0.796468
3 CustomModel_31 107 64 0.007828 0.184748 1.000000 0.952000 0.048000 -0.176920
4 CustomModel_31_DA 70 64 0.019230 0.164061 0.994683 0.959000 0.035683 -0.144830
5 CustomResnet_31 43 64 0.100193 1.243305 0.660944 0.633667 0.027277 -1.143112
6 CustomResnet_31_DA 51 64 0.054986 0.628499 0.863203 0.827333 0.035870 -0.573513
In [ ]:
model_names_128 = ['BaseModel_128', 'Basemodel_128_DA', 'Basemodel_128_DA_RE', 'CustomModel_128', 'CustomModel_128_DA', 'CustomResnet_128', 'CustomResnet_128_DA']

evaluation_128_df = pd.DataFrame()
for model_name in model_names_128:
    result_series = load_and_evaluate_model(model_name, batch_size)
    evaluation_128_df = pd.concat([evaluation_128_df, result_series], axis=1)

evaluation_128_df = evaluation_128_df.T.reset_index()
evaluation_128_df = evaluation_128_df.drop(['index'], axis=1)
evaluation_128_df = evaluation_128_df.style.apply(highlight_row, row_index=4, axis=1)
display(evaluation_128_df)
  Model Name Epochs Batch Size Train Loss Val Loss Train Acc Val Acc [Train - Val] Acc [Train - Val] Loss
0 BaseModel_128 33 64 0.001543 0.981181 0.995791 0.786333 0.209458 -0.979638
1 Basemodel_128_DA 55 64 0.008290 0.602679 0.957466 0.842000 0.115466 -0.594389
2 Basemodel_128_DA_RE 43 64 0.064911 0.891881 0.953146 0.777333 0.175812 -0.826971
3 CustomModel_128 68 64 0.018694 0.096466 1.000000 0.979000 0.021000 -0.077772
4 CustomModel_128_DA 85 64 0.009669 0.072805 0.995902 0.983000 0.012902 -0.063136
5 CustomResnet_128 63 64 0.019828 0.668877 0.977736 0.833333 0.144403 -0.649049
6 CustomResnet_128_DA 53 64 0.050298 0.455470 0.918033 0.876667 0.041366 -0.405172

We can see that our Custom CNN model based on VGGnet architechture trained on data augmeneted images, has the best overall results. With very good train and validation accuracy with not alot of overfitting.

Why does our custom model perform better then Resnet eventhough it is proven to be better?¶

This could be because our Custom Resnet model only has 12 layers (for 128x128) as compared to current Resnet models such as Resnet34 and ResNet 50. The advantage of Resnet over other models is that it can handle much deeper neural network layers due to its skip connections. However due to hardware and time limitations, we are not able to train a large Custom Resnet model of 34 to 50 layers deep. While our custom model based on VGG architechture, eventhough it has less layers, it proves to be a robust performer. While simple, this simplicity makes our model easier to train with limited hardware resources and time constraints.

Model Improvement¶

We will be using Keras Tuner to tune certain settings in our model. The parameters we are going to tune are:

  • Weight Decay
    • allows us to find the optimal regularization strength, hoping with hyperparam tuning to strike a balance between model complexity and generalization.
  • Amount of Neurons is our dense layers
    • As too few neurons may result in underfitting, while too many may lead to overfitting. So we need to find a balance of model complexity
  • Learning rate
    • If the learning rate is too high, our model might overshoot the optimal weights, if it's too low, the model may converge very slowly or get stuck in local minima.
In [ ]:
from keras_tuner import HyperModel
from tensorflow.keras import layers
from tensorflow.keras.regularizers import l2

class CustomHyperModel(HyperModel):
    def __init__(self, input_shape, num_classes):
        self.input_shape = input_shape
        self.num_classes = num_classes

    def build(self, hp):
        tf.keras.backend.clear_session()
        if self.input_shape == (31,31,1):
            num_convs = [3,3,3]
            num_filters = [64,128,256]
        elif self.input_shape == (128,128,1):
            num_convs = [2,2,2,3,3]
            num_filters = [16,32,64,128,256]
        X_input = layers.Input(self.input_shape)

        for i in range(len(num_convs)):
            if i == 0:
                X = ConvoBlock(X_input, num_convs[i], num_filters[i])
            else:
                X = ConvoBlock(X, num_convs[i], num_filters[i])

        X = layers.Flatten()(X)

        X = layers.Dense(hp.Int('dense_units', min_value=64, max_value=256, step=64), activation='relu', kernel_regularizer=l2(hp.Float("weight_decay",min_value = 0.00001,max_value=0.001)))(X)
        X = layers.Dense(hp.Int('dense_units', min_value=64, max_value=256, step=64), activation='relu', kernel_regularizer=l2(hp.Float("weight_decay",min_value = 0.00001,max_value=0.001)))(X)
        X = layers.Dropout(hp.Float('dropout_rate', min_value=0.0, max_value=0.3, step=0.1))(X)
        X = layers.Dense(self.num_classes, activation='softmax')(X)

        # Create the model
        model = tf.keras.Model(inputs=X_input, outputs=X)

        # Compile the model
        model.compile(optimizer=tf.keras.optimizers.SGD(hp.Choice('learning_rate', values=[1e-1,1e-2, 1e-3,1e-4]), momentum=0.9),
                      loss='categorical_crossentropy',
                      metrics=['accuracy'])

        return model
In [ ]:
customTunedModel_128 = CustomHyperModel(input_shape=(128, 128, 1), num_classes=15)
customTunedModel_31 = CustomHyperModel(input_shape=(31, 31, 1), num_classes=15)

tuner_128 = kt.Hyperband(customTunedModel_128, 
                        objective='val_accuracy', 
                        max_epochs=100,
                        factor=3,
                        project_name='TunedModel_128')

tuner_31 = kt.Hyperband(customTunedModel_31,
                        objective='val_accuracy',
                        max_epochs=100,
                        factor=3,
                        project_name='TunedModel_31')
In [ ]:
tuner_128.search(train_generator_128, epochs=100, validation_data=dataset_test_128, class_weight=class_weights_dict,steps_per_epoch=steps_per_epoch,callbacks=[EarlyStopping(monitor='val_loss', patience=10, verbose=1, mode='min')])
Trial 252 Complete [00h 10m 53s]
val_accuracy: 0.9733333587646484

Best val_accuracy So Far: 0.9853333234786987
Total elapsed time: 05h 20m 38s
In [ ]:
tuner_128.results_summary(3)
Results summary
Results in .\TunedModel_128
Showing 3 best trials
Objective(name="val_accuracy", direction="max")

Trial 0206 summary
Hyperparameters:
dense_units: 192
weight_decay: 0.0006602248964913205
dropout_rate: 0.1
learning_rate: 0.1
tuner/epochs: 100
tuner/initial_epoch: 34
tuner/bracket: 3
tuner/round: 3
tuner/trial_id: 0204
Score: 0.9853333234786987

Trial 0145 summary
Hyperparameters:
dense_units: 256
weight_decay: 0.0003630695567053518
dropout_rate: 0.1
learning_rate: 0.1
tuner/epochs: 100
tuner/initial_epoch: 34
tuner/bracket: 4
tuner/round: 4
tuner/trial_id: 0142
Score: 0.9783333539962769

Trial 0232 summary
Hyperparameters:
dense_units: 64
weight_decay: 0.0004988939209611291
dropout_rate: 0.1
learning_rate: 0.01
tuner/epochs: 100
tuner/initial_epoch: 34
tuner/bracket: 2
tuner/round: 2
tuner/trial_id: 0227
Score: 0.9756666421890259
In [ ]:
tuner_31.search(train_generator_31, epochs=100, validation_data=dataset_test_31, class_weight=class_weights_dict,steps_per_epoch=steps_per_epoch)
Trial 254 Complete [00h 05m 51s]
val_accuracy: 0.5139999985694885

Best val_accuracy So Far: 0.9789999723434448
Total elapsed time: 02h 42m 20s
In [ ]:
tuner_31.results_summary(3)
Results summary
Results in .\TunedModel_31
Showing 3 best trials
Objective(name="val_accuracy", direction="max")

Trial 0234 summary
Hyperparameters:
dense_units: 256
weight_decay: 0.0008862468274995598
dropout_rate: 0.1
learning_rate: 0.1
tuner/epochs: 100
tuner/initial_epoch: 34
tuner/bracket: 2
tuner/round: 2
tuner/trial_id: 0231
Score: 0.9789999723434448

Trial 0146 summary
Hyperparameters:
dense_units: 192
weight_decay: 0.000682698997366627
dropout_rate: 0.1
learning_rate: 0.1
tuner/epochs: 100
tuner/initial_epoch: 34
tuner/bracket: 4
tuner/round: 4
tuner/trial_id: 0143
Score: 0.9779999852180481

Trial 0249 summary
Hyperparameters:
dense_units: 64
weight_decay: 0.0002798940181868567
dropout_rate: 0.2
learning_rate: 0.1
tuner/epochs: 100
tuner/initial_epoch: 0
tuner/bracket: 0
tuner/round: 0
Score: 0.9746666550636292

Observations:

  • We can see that with the optimal weight decay values we optained in hyperparam tuning, our model's test accuracy has improved over 2%
  • We can see that our model converges better with a bigger learning rate values, as our top 3 results for both 128x128 and 31x31 have choosen 0.1 learning rate for their parameters.
In [ ]:
final_model_128 = tuner_128.get_best_models(num_models=1)[0]
final_model_31 = tuner_31.get_best_models(num_models=1)[0]
final_model_128.save('./models/final_model_128.h5')
final_model_31.save('./models/final_model_31.h5')
In [ ]:
final_model_128.summary()
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 128, 128, 1)]     0         
                                                                 
 conv2d (Conv2D)             (None, 128, 128, 16)      160       
                                                                 
 batch_normalization (BatchN  (None, 128, 128, 16)     64        
 ormalization)                                                   
                                                                 
 activation (Activation)     (None, 128, 128, 16)      0         
                                                                 
 conv2d_1 (Conv2D)           (None, 128, 128, 16)      2320      
                                                                 
 batch_normalization_1 (Batc  (None, 128, 128, 16)     64        
 hNormalization)                                                 
                                                                 
 activation_1 (Activation)   (None, 128, 128, 16)      0         
                                                                 
 max_pooling2d (MaxPooling2D  (None, 64, 64, 16)       0         
 )                                                               
                                                                 
 conv2d_2 (Conv2D)           (None, 64, 64, 32)        4640      
                                                                 
 batch_normalization_2 (Batc  (None, 64, 64, 32)       128       
 hNormalization)                                                 
                                                                 
 activation_2 (Activation)   (None, 64, 64, 32)        0         
                                                                 
 conv2d_3 (Conv2D)           (None, 64, 64, 32)        9248      
                                                                 
 batch_normalization_3 (Batc  (None, 64, 64, 32)       128       
 hNormalization)                                                 
                                                                 
 activation_3 (Activation)   (None, 64, 64, 32)        0         
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 32, 32, 32)       0         
 2D)                                                             
                                                                 
 conv2d_4 (Conv2D)           (None, 32, 32, 64)        18496     
                                                                 
 batch_normalization_4 (Batc  (None, 32, 32, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_4 (Activation)   (None, 32, 32, 64)        0         
                                                                 
 conv2d_5 (Conv2D)           (None, 32, 32, 64)        36928     
                                                                 
 batch_normalization_5 (Batc  (None, 32, 32, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_5 (Activation)   (None, 32, 32, 64)        0         
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 16, 16, 64)       0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 16, 16, 128)       73856     
                                                                 
 batch_normalization_6 (Batc  (None, 16, 16, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_6 (Activation)   (None, 16, 16, 128)       0         
                                                                 
 conv2d_7 (Conv2D)           (None, 16, 16, 128)       147584    
                                                                 
 batch_normalization_7 (Batc  (None, 16, 16, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_7 (Activation)   (None, 16, 16, 128)       0         
                                                                 
 conv2d_8 (Conv2D)           (None, 16, 16, 128)       147584    
                                                                 
 batch_normalization_8 (Batc  (None, 16, 16, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_8 (Activation)   (None, 16, 16, 128)       0         
                                                                 
 max_pooling2d_3 (MaxPooling  (None, 8, 8, 128)        0         
 2D)                                                             
                                                                 
 conv2d_9 (Conv2D)           (None, 8, 8, 256)         295168    
                                                                 
 batch_normalization_9 (Batc  (None, 8, 8, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_9 (Activation)   (None, 8, 8, 256)         0         
                                                                 
 conv2d_10 (Conv2D)          (None, 8, 8, 256)         590080    
                                                                 
 batch_normalization_10 (Bat  (None, 8, 8, 256)        1024      
 chNormalization)                                                
                                                                 
 activation_10 (Activation)  (None, 8, 8, 256)         0         
                                                                 
 conv2d_11 (Conv2D)          (None, 8, 8, 256)         590080    
                                                                 
 batch_normalization_11 (Bat  (None, 8, 8, 256)        1024      
 chNormalization)                                                
                                                                 
 activation_11 (Activation)  (None, 8, 8, 256)         0         
                                                                 
 max_pooling2d_4 (MaxPooling  (None, 4, 4, 256)        0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 4096)              0         
                                                                 
 dense (Dense)               (None, 192)               786624    
                                                                 
 dense_1 (Dense)             (None, 192)               37056     
                                                                 
 dropout (Dropout)           (None, 192)               0         
                                                                 
 dense_2 (Dense)             (None, 15)                2895      
                                                                 
=================================================================
Total params: 2,748,223
Trainable params: 2,745,471
Non-trainable params: 2,752
_________________________________________________________________
In [ ]:
final_model_31.summary()
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 31, 31, 1)]       0         
                                                                 
 conv2d (Conv2D)             (None, 31, 31, 64)        640       
                                                                 
 batch_normalization (BatchN  (None, 31, 31, 64)       256       
 ormalization)                                                   
                                                                 
 activation (Activation)     (None, 31, 31, 64)        0         
                                                                 
 conv2d_1 (Conv2D)           (None, 31, 31, 64)        36928     
                                                                 
 batch_normalization_1 (Batc  (None, 31, 31, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_1 (Activation)   (None, 31, 31, 64)        0         
                                                                 
 conv2d_2 (Conv2D)           (None, 31, 31, 64)        36928     
                                                                 
 batch_normalization_2 (Batc  (None, 31, 31, 64)       256       
 hNormalization)                                                 
                                                                 
 activation_2 (Activation)   (None, 31, 31, 64)        0         
                                                                 
 max_pooling2d (MaxPooling2D  (None, 15, 15, 64)       0         
 )                                                               
                                                                 
 conv2d_3 (Conv2D)           (None, 15, 15, 128)       73856     
                                                                 
 batch_normalization_3 (Batc  (None, 15, 15, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_3 (Activation)   (None, 15, 15, 128)       0         
                                                                 
 conv2d_4 (Conv2D)           (None, 15, 15, 128)       147584    
                                                                 
 batch_normalization_4 (Batc  (None, 15, 15, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_4 (Activation)   (None, 15, 15, 128)       0         
                                                                 
 conv2d_5 (Conv2D)           (None, 15, 15, 128)       147584    
                                                                 
 batch_normalization_5 (Batc  (None, 15, 15, 128)      512       
 hNormalization)                                                 
                                                                 
 activation_5 (Activation)   (None, 15, 15, 128)       0         
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 7, 7, 128)        0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 7, 7, 256)         295168    
                                                                 
 batch_normalization_6 (Batc  (None, 7, 7, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_6 (Activation)   (None, 7, 7, 256)         0         
                                                                 
 conv2d_7 (Conv2D)           (None, 7, 7, 256)         590080    
                                                                 
 batch_normalization_7 (Batc  (None, 7, 7, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_7 (Activation)   (None, 7, 7, 256)         0         
                                                                 
 conv2d_8 (Conv2D)           (None, 7, 7, 256)         590080    
                                                                 
 batch_normalization_8 (Batc  (None, 7, 7, 256)        1024      
 hNormalization)                                                 
                                                                 
 activation_8 (Activation)   (None, 7, 7, 256)         0         
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 3, 3, 256)        0         
 2D)                                                             
                                                                 
 flatten (Flatten)           (None, 2304)              0         
                                                                 
 dense (Dense)               (None, 256)               590080    
                                                                 
 dense_1 (Dense)             (None, 256)               65792     
                                                                 
 dropout (Dropout)           (None, 256)               0         
                                                                 
 dense_2 (Dense)             (None, 15)                3855      
                                                                 
=================================================================
Total params: 2,583,951
Trainable params: 2,581,263
Non-trainable params: 2,688
_________________________________________________________________

Final Model¶

Now, we are checking how well our final model works. To make sure it's good at handling new data, we want the accuracy on the validation dataset to be similar to what we saw on the test set. This helps us trust that the model is not just good on the data it learned from but also on new, unseen examples. :)

Evaluating our Model on our validation dataset¶

In [ ]:
final_model_128 = tf.keras.models.load_model('./models/final_model_128.h5')
final_model_31 = tf.keras.models.load_model('./models/final_model_31.h5')
WARNING:tensorflow:Error in loading the saved optimizer state. As a result, your model is starting with a freshly initialized optimizer.
WARNING:tensorflow:Error in loading the saved optimizer state. As a result, your model is starting with a freshly initialized optimizer.
In [ ]:
final_model_128.evaluate(dataset_validation_128)
47/47 [==============================] - 1s 19ms/step - loss: 0.0659 - accuracy: 0.9837
Out[ ]:
[0.06585882604122162, 0.9836666584014893]
In [ ]:
final_model_31.evaluate(dataset_validation_31)
47/47 [==============================] - 1s 12ms/step - loss: 0.0692 - accuracy: 0.9820
Out[ ]:
[0.06922943890094757, 0.9819999933242798]

We can see that our accuracy on the validation dataset is 98.37% for our 128x128 model and 98.20% for our 31x31 model. These results are very close to our test dataset results, especially for our 128x128 model. With hyperparemeter tuning, our 31x31 model improves over 3% on the validation data. This shows that our model not only does not overfit it is able to generalise very well to unseen data. :)

Classification Report¶

In [ ]:
# Not shuffling dataset to avoid confusion in the classification report
dataset_validation_128 = dataset(directory_validation, (128, 128), shuffle=False)
dataset_validation_31 = dataset(directory_validation, (31, 31), shuffle=False)

# Assuming `class_labels` is a list of your class labels
class_labels = [str(label) for label in class_labels]

y_true_128 = np.concatenate([y for x, y in dataset_validation_128], axis=0)
y_true_31 = np.concatenate([y for x, y in dataset_validation_31], axis=0)
test_preds_probs_128 = final_model_128.predict(dataset_validation_128)
test_preds_probs_31 = final_model_31.predict(dataset_validation_31)
test_pred_128 = np.argmax(test_preds_probs_128, axis=1)
test_pred_31 = np.argmax(test_preds_probs_31, axis=1)

report_128 = classification_report(
    np.argmax(y_true_128, axis=1), test_pred_128, target_names=class_labels
)

report_31 = classification_report(
    np.argmax(y_true_31, axis=1), test_pred_31, target_names=class_labels
)
print("Classification Report (128x128):")
print(report_128)
Found 3000 files belonging to 15 classes.
Found 3000 files belonging to 15 classes.
47/47 [==============================] - 1s 22ms/step
47/47 [==============================] - 0s 8ms/step
Classification Report (128x128):
              precision    recall  f1-score   support

        Bean       0.99      0.98      0.99       200
Bitter Gourd       0.99      0.99      0.99       200
Bottle Gourd       0.99      0.98      0.98       200
     Brinjal       0.99      0.99      0.99       200
    Broccoli       1.00      0.98      0.99       200
     Cabbage       0.99      0.98      0.98       200
    Capsicum       0.98      0.99      0.99       200
      Carrot       0.97      1.00      0.99       200
 Cauliflower       0.99      1.00      0.99       200
    Cucumber       0.98      0.99      0.98       200
      Papaya       0.99      0.94      0.97       200
      Potato       0.95      0.99      0.97       200
     Pumpkin       0.96      0.98      0.97       200
      Radish       0.99      0.98      0.99       200
      Tomato       0.99      0.96      0.98       200

    accuracy                           0.98      3000
   macro avg       0.98      0.98      0.98      3000
weighted avg       0.98      0.98      0.98      3000

In [ ]:
print("Classification Report (31x31):")
print(report_31)
Classification Report (31x31):
              precision    recall  f1-score   support

        Bean       0.98      0.98      0.98       200
Bitter Gourd       0.99      0.99      0.99       200
Bottle Gourd       1.00      0.98      0.99       200
     Brinjal       0.98      0.97      0.97       200
    Broccoli       0.97      0.98      0.98       200
     Cabbage       0.97      0.96      0.97       200
    Capsicum       0.99      0.99      0.99       200
      Carrot       0.99      0.99      0.99       200
 Cauliflower       0.98      0.98      0.98       200
    Cucumber       0.99      0.99      0.99       200
      Papaya       0.97      0.98      0.98       200
      Potato       0.99      0.97      0.98       200
     Pumpkin       0.98      0.99      0.98       200
      Radish       0.99      0.96      0.97       200
      Tomato       0.98      0.98      0.98       200

    accuracy                           0.98      3000
   macro avg       0.98      0.98      0.98      3000
weighted avg       0.98      0.98      0.98      3000

From looking at the classification report, we can see that

  • The distribution of classes in our validation dataset is perfectly balanced
  • Our model does generalise to our classes very well and do not appear to be biased to any 1 class.
  • The overall accuracy of 98% in both models indicates that they perform exceptionally well in correctly classifying vegetable images. :)

Error Analysis¶

We can look and analyze our model's mistakes

In [ ]:
import random
incorrect_indices_128 = np.nonzero(test_pred_128 != np.argmax(y_true_128, axis=1))[0]
incorrect_indices_31 = np.nonzero(test_pred_31 != np.argmax(y_true_31, axis=1))[0]

incorrect_images_128 = np.concatenate([x for x, y in dataset_validation_128], axis=0)[incorrect_indices_128]
incorrect_images_31 = np.concatenate([x for x, y in dataset_validation_31], axis=0)[incorrect_indices_31]

incorrect_data_128 = list(zip(incorrect_indices_128, incorrect_images_128))
random.shuffle(incorrect_data_128)
incorrect_indices_128, incorrect_images_128 = zip(*incorrect_data_128)

incorrect_data_31 = list(zip(incorrect_indices_31, incorrect_images_31))
random.shuffle(incorrect_data_31)
incorrect_indices_31, incorrect_images_31 = zip(*incorrect_data_31)

# Now you can plot the shuffled incorrect images as before
fig, axes = plt.subplots(nrows=3, ncols=5, figsize=(15, 9))
for i, ax in enumerate(axes.flat):
    if i < len(incorrect_indices_128):
        ax.imshow(incorrect_images_128[i], cmap='gray')
        ax.set_title(f"Pred: {class_labels[test_pred_128[incorrect_indices_128[i]]]}, True: {class_labels[np.argmax(y_true_128[incorrect_indices_128[i]])]}")
    ax.axis('off')
plt.tight_layout()
plt.show()
No description has been provided for this image

When looking at the sample examples of our 128x128 model's predictions:

  • It appears that the model's mistakes are sometimes quite dumb, where it mistakes a papaya as a carrot.
  • This suggests that we need to make our 128x128 model deeper and more complex to extract more prominent features from our vegatables.
  • However some of its mistakes are reasonable, such as mistaking papayas for potato in black and white. Which highlights the impact of factors beyond our model's architecture, such as variations in color and image quality.
In [ ]:
fig, axes = plt.subplots(nrows=3, ncols=5, figsize=(15, 9))
for i, ax in enumerate(axes.flat):
    if i < len(incorrect_indices_31):
        ax.imshow(incorrect_images_31[i], cmap='gray')
        ax.set_title(f"Pred: {class_labels[test_pred_31[incorrect_indices_31[i]]]}, True: {class_labels[np.argmax(y_true_31[incorrect_indices_31[i]])]}")
    ax.axis('off')
plt.tight_layout()
plt.show()
No description has been provided for this image

When looking at the sample examples of our 31x31 model's predictions:

  • The low pixel resolution makes it ambguious even to a human what the correct class is.
  • At such a size the details and distinct features that characterize different vegetables might be reduced or even lost.

So it is reasonable for the model to make such mistakes. Thus our model is doing quite well as some errors are because the images are naturally hard to interpret.

Final Model Visualization¶

In [ ]:
visualkeras.layered_view(final_model_128,legend=True, to_file="./images/final_model_128.png")
Out[ ]:
No description has been provided for this image
In [ ]:
visualkeras.layered_view(final_model_31,legend=True, to_file="./images/final_model_31.png")
Out[ ]:
No description has been provided for this image

Summary¶

To close off this project, this CNN project has been a great learning experience. The main focus was tweaking models for different picture sizes, like 31x31 and 128x128 pixels. Dealing with TensorFlow's batch dataset brought its own set of challenges, and getting everything just right took some time. Experimenting with different model architechture. This project taught me alot about CNNs and its architechture,while it wasn't always smooth sailing, these challenges gave me practical insights into how deep learning works in the real world.

References¶

Adam - Cornell University Computational Optimization Open Textbook - Optimization Wiki (no date). https://optimization.cbe.cornell.edu/index.php?title=Adam.

Zhou, P. (2020) Towards theoretically understanding why SGD generalizes better than ADAM in deep learning. https://arxiv.org/abs/2010.05627.

Simonyan, K. (2014) Very deep convolutional networks for Large-Scale image recognition. https://arxiv.org/abs/1409.1556.

He, K. (2015) Deep residual learning for image recognition. https://arxiv.org/abs/1512.03385.